web-dev-qa-db-fra.com

Indications de type avec des classes définies par l'utilisateur

Impossible de trouver une réponse définitive. Je veux faire un conseil de type pour une fonction et le type étant une classe personnalisée que j'ai définie, appelée CustomClass().

Et puis, disons, dans une fonction, appelez-la FuncA(arg), j'ai un argument nommé arg. Est-ce que la bonne façon de taper indice FuncA serait:

def FuncA(arg: CustomClass):

Ou serait-ce:

def FuncA(Arg:Type[CustomClass]):?

54
hhprogram

Le précédent est correct , si arg accepte une instance de CustomClass:

def FuncA(arg: CustomClass):
    #     ^ instance of CustomClass

Si vous voulez que la classe CustomClass elle-même (ou un sous-type) , alors vous devriez écrire:

from typing import Type  # you have to import Type

def FuncA(arg: Type[CustomClass]):
    #     ^ CustomClass (class object) itself

Comme cela est écrit dans la documentation sur Taper :

class typing.Type(Generic[CT_co])

Une variable annotée avec C peut accepter une valeur de type C. En revanche, une variable annotée avec Type[C] Peut accepter des valeurs qui sont des classes elles-mêmes - plus précisément, elle acceptera le Objet de classe de C.

La documentation comprend un exemple avec la classe int:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
70
Willem Van Onsem