1

下面的 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
4

2 回答 2

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)

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

于 2013-09-04T12:29:58.647 回答
1

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

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

解决方法是将默认值设置为无,并在方法中检查:

def sendCommand(command, callback=None):
   if callback is None:
        callback=NetVend.blankCallback
于 2013-09-04T12:30:47.433 回答