19

Python 関数アノテーションを使用して、静的ファクトリ メソッドの戻り値の型を指定するつもりでした。これは、アノテーションの望ましい使用例の 1 つであることを理解しています。

class Trie:
    @staticmethod
    def from_mapping(mapping) -> Trie:
        # docstrings and initialization ommitted
        trie = Trie()
        return trie

PEP 3107は次のように述べています。

関数の注釈は、コンパイル時に任意の Python 式を関数のさまざまな部分に関連付ける方法にすぎません。

Trieは Python で有効な式ですね。Pythonは同意しないか、名前が見つかりません:

def from_mapping(mapping) -> Trie:
NameError: name 'Trie' is not defined

object基本型 (または などint) または標準ライブラリ型 ( などcollections.deque) が指定されている場合、このエラーは発生しないことに注意してください。

このエラーの原因と修正方法を教えてください。

4

2 に答える 2

11

PEP 484 は、これに対する公式の解決策を前方参照の形で提供します。

型ヒントにまだ定義されていない名前が含まれている場合、その定義は文字列リテラルとして表現され、後で解決される場合があります。

質問コードの場合:

class Trie:
    @staticmethod
    def from_mapping(mapping) -> Trie:
        # docstrings and initialization ommitted
        trie = Trie()
        return trie

なる:

class Trie:
    @staticmethod
    def from_mapping(mapping) -> 'Trie':
        # docstrings and initialization ommitted
        trie = Trie()
        return trie
于 2016-05-22T11:25:35.943 に答える