以下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
答案 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