【问题标题】:Python NameError exception, how do I debug it?Python NameError 异常,如何调试?
【发布时间】:2022-01-29 03:01:10
【问题描述】:

我有一个 Python NameError 异常,例如:

>>> def test():
...   var = 123
...
>>> test()
>>> print(var)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'var' is not defined

我应该采取哪些步骤来调试它?我该如何解决?

【问题讨论】:

  • 近距离目标不准确。我正在尝试就如何在一般情况下调试这些问题进行问答(一个规范的答案)。我还没有找到任何足够笼统的问题,也没有为新手展示一步一步的方法。这是一个足够普遍的问题,足以保证一个很好的规范解释。
  • 很公平,我相信副本很接近,但我同意这个更通用。
  • @Selcuk 不幸的是,这个问题对提问者来说非常具体,包含很多代码,答案解决了他的具体情况。新手很难从中理解。我很乐意提供任何其他建议:-)

标签: python debugging nameerror


【解决方案1】:

第 1 步 - 找出使用的变量的位置:

阅读NameError异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'var' is not defined

最后一行包含变量的名称,在本例中为var。确保拼写正确,并且您没有记错。

NameError 的正上方,您可以看到文件名和行号。这是您尝试使用该变量的位置。

第 2 步 - 找出定义变量的位置:

查找var = 或任何包含var 作为参数的函数:

def func(var):
    ...

您要使用的变量在哪里?它存在于哪里?

尝试在 Windows 中使用 ctrl+f 或在 Mac 中使用 cmd+f 在所有 Python 文件中查找该名称。

第 3 步 - 尝试了解范围规则:

  • 如果变量是在函数中定义的:

    我在同一个功能吗?

    def test():
        var = 1
    
    print(var)  # This will not work.
    
    def test2():
        print(var)  # This will not work either.
    

    如果您不在同一个函数中,请尝试通过返回变量来修复:

    def test():
        var = 1
        return var
    
    var = test()
    
    print(var)  # This will work
    

    或者通过接受变量作为参数:

    var = test()
    
    def test2(x):  # var is now named 'x'
        print(x)  
    
    test2(var)
    

    你也可以返回多个变量:

    def test():
         var1 = "hello"
         var2 = "world" 
         return var1, var2
    var1, var2 = test()
    print(var1, var2)  # Prints hello world.
    

    如果您在同一个函数中或使用global,您是否使用了if 语句并且从未输入过它们?也许是抛出了异常而你被压制了?

    def test():
         if False:  # Never true
             var = 123
         print(var)  # This will not work
    
    def test2():
         try:
             2/0  # Throws an error
             var = 123
         except:
             pass
         print (var)  # This will not work
    
  • 如果变量是在类中定义的:

    class Test:
        var = 123
        def func(self):
            print(var)  # This will not work
    

    确保您使用self 访问它:

    class Test:
        var = 123
        def func(self):
            print(self.var)  # This will work
    

    使用默认参数传递它:

    class Test:
        var = 123
        def func(self, param=var):
            print(param)
    

    或使用实例访问它:

    class Test:
        var = 123
        def func(self, param=var):
            print(param)
    inst = Test()
    inst.var  # This will work
    inst.func()  # This will work
    
  • 如果变量是函数或类的名称:

    确保在使用前定义:

    func()
    def func():  # This will not work
        pass
    
  • 如果找不到或者不在同一个文件中:

    您是否尝试导入它却忘记了?

    import operator
    itemgetter # This will not work
    operator.itemgetter  # This will work
    

    您确定拼写正确吗?请记住,Python 区分大小写!

有关范围界定的更多信息,请参阅this answer

如果一切都失败了,而您仍然没有找到答案,随时欢迎您提出问题并提出问题,或者在您现有的 stackoverflow 问题的 cmets 中写下。

阅读question checklist 并提供一个最小示例 - 确保您的示例包含足够的代码以查看变量的定义位置和使用位置,但代码不要太多,因为它会难以理解。

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 2014-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多