[英]Python NameError when defining class
由於某種原因,下面的 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
您不能在定義類名的同時引用它。
類主體作為本地命名空間執行; 您可以將函數和屬性稱為本地名稱。
此外,函數關鍵字參數的默認值在定義時綁定,而不是在調用方法時綁定。 使用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)
您可能希望將該類用作實例的工廠,而不是用作本質上函數的命名空間。 即使您只使用了一個實例(單例),首先實際創建一個實例也是有好處的。
好吧,我不會說第一個,但第二個選項肯定是正確的 :-)
問題是默認參數在編譯時被評估,但此時NetVend
不存在於該范圍內,因為(顯然)類本身尚未完全評估。
繞過它的方法是將默認值設置為無,並在方法中檢查:
def sendCommand(command, callback=None):
if callback is None:
callback=NetVend.blankCallback
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.