2016-06-09 42 views

回答

1

簡短的回答,您需要包含類的模塊名稱,你需要輸入一些無法訪問的代碼內的模塊,像這樣:

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 
相關問題