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?
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]
oùC
est une classe. En d'autres termes, lorsqueC
est le nom d'une classe, utiliserC
pour annoter un argument déclare que l'argument est une instance deC
(ou d'une sous-classe deC
), mais en utilisantType[C]
en tant qu'annotation d'argument déclare que l'argument est un objet de classe dérivant deC
(ouC
lui-même).
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.