定义类时的Python NameError

时间:2013-09-04 12:28:13

标签: python python-3.x

以下Python由于某种原因失败。

class NetVend:
    def blankCallback(data):
        pass

    def sendCommand(command, callback=NetVend.blankCallback):
        return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

    def sendSignedCommand(command, signature, callback):
        pass

我收到以下错误:

Traceback (most recent call last):
  File "module.py", line 1, in <module>
    class NetVend:
  File "module.py", line 5, in NetVend
    def sendCommand(command, callback=NetVend.blankCallback):
NameError: name 'NetVend' is not defined

2 个答案:

答案 0 :(得分:4)

在定义时,不能引用类名

类主体作为本地名称空间执行;您可以将函数和属性称为本地名称。

此外,函数关键字参数的默认值绑定在定义时间,而不是在调用方法时。请改用None作为哨兵。

而不是:

def sendCommand(command, callback=NetVend.blankCallback):
    return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

使用:

def sendCommand(command, callback=None):
    if callback is None:
        callback = NetVend.blankCallback
    return NetVend.sendSignedCommand(command, NetVend.signCommand(command), callback)

您可能希望将该类用作实例的工厂,而不是作为基本函数的命名空间。即使您只使用了一个实例(单例),实际创建实例也会有好处。

答案 1 :(得分:1)

好吧,我不会说第一个,但第二个选项肯定是正确的: - )

问题是默认参数是在编译时计算的,但是在那个范围内NetVend不存在,因为(显然)类本身尚未完全评估。

绕过它的方法是将默认值设置为None,并在方法中检查:

def sendCommand(command, callback=None):
   if callback is None:
        callback=NetVend.blankCallback