2017-02-21 6 views
2

関数の戻り値の型が基底クラスではなく、どのようにして関数を定義できますか?例:Python pep484型チェックで自己を返す上位レベルのメソッドはどうすればいいですか

Class Parent: 
    def set_common_properties_from_string(input : str) -> <WHAT SHOULD BE HERE> 
    # Do some stuff you want to do in all classes 
    return self 

Class Child(Parent): 
    pass 

    def from_file(filename : str) -> 'Child' 
     return Child().set_common_properties_from_string() # The return type of set_common must be Child 

または何とか1つキャストする必要がありますか?戻り値の型がbaseclassの場合、エラーが発生します。

私はちょうど2行にドロップし、Child()を保持するための一時変数を追加することができます知っているが、私は1つのライナーがはるかに見栄えが良いと思う。

私はタイプチェックにmypyを使用しています。

+1

だけでスタイルのヒント:後に、括弧の前にスペースがあなたのコードはあまり読みやすく。 – MKesper

答えて

0

新しく実装された(まだ実験中の)generic self機能を使用できます。これは、発生している問題を正確に解決するための仕組みです。

Mypyは、version 0.4.6(注:書き込み時の最新バージョンのmypyは0.470です)をサポートしています。残念ながら、他のPEP 484準拠のタイプチェッカーがまだこの機能をサポートしていない場合、頭の上から覚えていません。つまり、新しいTypeVarを作成し、self変数にその型を明示的に注釈を付け、そのTypeVarを戻り値にする必要があります。内、そのように - 私たちはParentクラスで囲まれたことが私たちのTypeVarを設定する必要が

from typing import TypeVar 

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

class Parent: 
    def set_common_properties(self: T, input: str) -> T: 
     # Do some stuff you want to do in all classes 
     return self 

class Child(Parent): 
    def from_file(self, filename: str) -> 'Child': 
     # More code here 
     return Child().set_common_properties(...) 

注:

だからあなたの場合には、次のようにコードを変更する必要があるだろうset_common_propertiesメソッドを使用すると、Parentに存在する他のメソッドを呼び出すことができます。

あなたはPEP mypyのウェブサイトや内484を少しより多くの情報を見つけることができます。

関連する問題