2016-08-29 2 views
6

は、初期化のためのヘルパーメソッドを持つクラスを考える:値がclsのインスタンスの場合、戻り値の型を注釈できますか?

class TrivialClass: 
    def __init__(self, str_arg: str): 
     self.string_attribute = str_arg 

    @classmethod 
    def from_int(cls, int_arg: int) -> ?: 
     str_arg = str(int_arg) 
     return cls(str_arg) 

from_intメソッドの戻り値の型に注釈を付けることが可能ですか?

私はとTrivialClassの両方を試しましたが、PyCharmはその時点で合理的に聞こえる未解決の参照としてフラグを立てます。

+0

私は[issue 1212](https://github.com/python/mypy/issues/1212)がこのユースケースに具体的に対処しているため、私の答えを書き直しました。 –

答えて

12

あなたがclsのインスタンスを返すことがありますことを示すためにジェネリック型を使用してください:

from typing import Type, TypeVar 

T = TypeVar('T', bound='TrivialClass') 

class TrivialClass: 
    # ... 

    @classmethod 
    def from_int(cls: Type[T], int_arg: int) -> T: 
     # ... 
     return cls(...) 

どれサブクラスは、クラスのメソッドをオーバーライドするが、その後親クラスのインスタンスを返す(TrivialClassかファクトリメソッドがタイプclsのインスタンスを返すものとして定義されているため、まだ祖先であるサブクラス)がエラーとして検出されます。

bound引数は、Tが()のサブクラスでなければならないと指定します。ジェネリックを定義するときにクラスがまだ存在しないため、forward reference(名前のある文字列)を使用する必要があります。

Annotating instance and class methods section


PEP 484の注を参照してください:この回答の最初のリビジョンは、戻り値としてクラス自体を命名前方参照 を使用して提唱したが、 issue 1212は代わりにジェネリックを使用することが可能になりました、より良い解決策です。

+0

clsへの前方参照を作成することはできますか? – Jonatan

+0

@Jonatan:いいえ、 'cls'は型ではありません。 –

+1

@ Jonatan: 'TrivialClass'のサブクラスも型ヒントを満たすことに注意してください。 –

関連する問題