簡體   English   中英

定義類時出現Python NameError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM