web-dev-qa-db-fra.com

Sous-classe dans l'indication de type

Je veux autoriser l'indication de type en utilisant Python 3 pour accepter les sous-classes d'une certaine classe. Par exemple:

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

Maintenant, lors de la saisie du code suivant:

process_any_subclass_type_of_A(B)

J'obtiens un PyCharm IDE indice "Type attendu A, obtenu type [B] à la place."

Comment puis-je changer le type d'indication ici pour accepter les sous-types de A?

Selon cela ( https://www.python.org/dev/peps/pep-0484/#type-definition-syntax , "les expressions dont le type est un sous-type d'un type d'argument spécifique sont également accepté pour cet argument. "), je comprends que ma solution (cls: A) devrait marcher?

16
user1211030

Quand vous faites cls: A, vous dites que cls va sur une instance de type A. Pour le faire fonctionner avec le type ou ses sous-types, utilisez typing.Type .

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

De Le type d'objets de classe :

Parfois, vous voulez parler d'objets de classe qui héritent d'une classe donnée. Cela peut être orthographié comme Type[C]C est une classe. En d'autres termes, lorsque C est le nom d'une classe, utiliser C pour annoter un argument déclare que l'argument est une instance de C (ou d'une sous-classe de C), mais en utilisant Type[C] en tant qu'annotation d'argument déclare que l'argument est un objet de classe dérivant de C (ou C lui-même).

30
Ashwini Chaudhary

J'ai trouvé la solution. Utilisation:

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

Et le comportement souhaité sera là comme indiqué dans le PEP ci-dessus.

6
user1211030