我嘗試做以下事情:mypy明確的類型暗示仍沒有給出定義的錯誤
self.sender = None # type: 'Node'
我無法導入節點,因爲我會得到一個週期。所以我把它寫在引號喜歡這裏 http://mypy.readthedocs.io/en/latest/common_issues.html#import-cycles 提及,但我仍然得到以下錯誤
error: Name 'Node' is not defined
對此有任何解決方案?
謝謝!
我嘗試做以下事情:mypy明確的類型暗示仍沒有給出定義的錯誤
self.sender = None # type: 'Node'
我無法導入節點,因爲我會得到一個週期。所以我把它寫在引號喜歡這裏 http://mypy.readthedocs.io/en/latest/common_issues.html#import-cycles 提及,但我仍然得到以下錯誤
error: Name 'Node' is not defined
對此有任何解決方案?
謝謝!
簡短的回答,您需要包含類的模塊名稱,你需要輸入一些無法訪問的代碼內的模塊,像這樣:
if False:
# for forward-reference type-checking:
import mymodule
class MyClass(object):
def __init__(self):
self.sender = None # type: mymodule.Node
爲了理解爲什麼這是必需的(和爲什麼它的工作原理),你必須首先意識到mypy正在做靜態代碼分析。這意味着它不會導入你的模塊,它解析和分析從模塊文件中讀取的文本。
當上面的模塊被導入時,import mymodule
行永遠不會運行,因此會避免循環導入,但它仍然可用於mypy解析。這就是mypy如何在分析過程中解決對mymodule.Node
的引用。
爲了完整起見,我應該指出,它不要求你使用模塊的名稱,你可以使用解析過程中不會引起衝突的任何名稱:
if False:
from mymodule import Node
class MyClass(object):
def __init__(self):
self.sender = None # type: Node
還要注意,您不需要在註釋中出現的類型名稱周圍使用引號。這隻有在類型註釋直接出現在python對象中時纔有必要。以下是可能發生的一些情況:
from typing import Optional, NamedTuple
if False:
from mymodule import Node
NodeInfo = NamedTuple('NodeInfo', [('node', 'Node'), ('info', dict)])
class MyClass(object):
def __init__(self, sender: Optional['Node'] = None):
self.sender = sender