2017-03-22 20 views
1

インターフェイスがAで、1つの関数があるとします。インターフェイスを実装しているクラスのヒントタイプ

class A(metaclass=ABCMeta): 

    @abstractmethod 
    def spam(self, x: int) -> str: 
     pass 

あり、このインタフェースを実装するクラスBCがありますが、それらは直接初期化されません。私はAを実装する適切なオブジェクトを私に返すファクトリメソッドを持っています。この場合、BCspamを実装すると、タイプヒントを繰り返す必要がありますか?実際には、BCは直接使用されないので、Aのタイプヒントで十分です。しかし、私はこの状況でのベストプラクティスに興味があります。考慮すべき他の問題がある場合。

+1

静的解析を実行している場合、最も安全なオプションはどこにでもヒントを提供することです。この質問は実際にスタティック・アナライザーがどのように実装されているかにかかっていますが、私はあなたのクラスが抽象メソッドを実装していることをアナライザーが認識しないと考えています。 –

答えて

0

おそらく、B.spamを実装しているため、それは簡単な実装ではありません(そうでなければ、A.spamをオーバーライドするのはどうしてですか?)。だからおそらくB.spamの本文をチェックしてください。その場合は、引数の型ヒントを提供し、戻り値はB.spamです。そうでなければ、mypyはこれらのタイプをAnyとして扱います。あなたはタイプのヒントを提供しない場合、mypyはBは非事実上Aから派生した場合B.spamの種類は、そのrules for subclassingが、のみを使用してA.spamと互換性があることを確認することが

注意。 A.register(B)の場合、mypyは継承関係を完全に無視します。これは、ランタイムがバーチャルベースクラスで.spamをルックアップしない方法と一貫しています。

+0

なぜ私の答えが間違っているかについての明確化は歓迎されるでしょう。 – max

関連する問題