1. ホーム
  2. python

[解決済み] タイプヒンティングのサブクラス

2022-06-19 17:56:06

質問

Python3を使って、あるクラスのサブクラスを受け付けるタイプヒンティングを可能にしたい。例えば

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のヒント「Expected type A, got Type[B] instead.」が表示されます。

Aのサブタイプを受け付けるようにするにはどうしたらよいでしょうか。

によると PEP 484 ("Expressions whose type is a subtype of a specific argument type are also accepted for that argument.") によると、私は自分の解決策である (cls: A) は動作する必要がありますか?

どのように解決するには?

を指定した場合 cls: A と指定すると cls インスタンス タイプの A . を指定するための型ヒントは cls をクラスオブジェクトとして指定します。 A (またはそのサブタイプ) が使用します。 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 そのもの) を使用します。