web-dev-qa-db-ja.com

型ヒントのサブクラス

特定のクラスのサブクラスを受け入れるためにPython 3を使用してタイプヒントを許可したい。例えば:

class A:
    pass

class B(A):
    pass

class C(A):
    pass

def process_any_subclass_type_of_A(cls: A):
    if cls == B:
        # do something
    Elif cls == C:
        # do something else

次のコードを入力するとき:

process_any_subclass_type_of_A(B)

PyCharm IDEヒント 'タイプAが必要ですが、代わりにタイプ[B]を取得しました。]

Aのサブタイプを受け入れるために、ここでタイプヒンティングを変更するにはどうすればよいですか?

これによれば( https://www.python.org/dev/peps/pep-0484/#type-definition-syntax 、 "特定の引数型のサブタイプである式もその議論を受け入れました。」)、私の解決策(cls: A)動作するはずです?

16
user1211030

cls: Aを実行すると、clsA型のインスタンスになります。タイプまたはそのサブタイプで動作させるには、 typing.Type を使用します。

from typing import Type
def process_any_subclass_type_of_A(cls: Type[A]):
    pass

から クラスオブジェクトのタイプ

特定のクラスを継承するクラスオブジェクトについて話したい場合があります。これはType[C]と綴ることができます。ここでCはクラスです。つまり、Cがクラスの名前である場合、Cを使用して引数に注釈を付けると、引数がC(またはCのサブクラス)のインスタンスであると宣言されますが、引数注釈としてType[C]を使用すると宣言されます引数はC(またはC自体)から派生したクラスオブジェクトです。

30

ソルトンを見つけました。使用する:

from typing import Type
def process_any_subclass_type_of_A(cls: Type[A]):
    pass

そして、上記のPEPで述べたように、望ましい動作がそこにあります。

6
user1211030