簡単に言えば、クラスのモジュール名を含める必要があり、次のように、到達できないコード内にそのモジュールをインポートする必要があります。
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