6

私は次のことをしようとしています:

self.sender = None # type: 'Node'

サイクルが発生するため、ノードをインポートできません。だから私はここで述べたように引用符でそれを書きます http://mypy.readthedocs.io/en/latest/common_issues.html#import-cycles しかし、私はまだ次のエラーが発生します

error: Name 'Node' is not defined

これに対する解決策はありますか?

ありがとう!

4

1 に答える 1

7

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

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
于 2016-08-15T19:59:28.277 に答える