Tapez des indices avec des classes définies par l'utilisateur

103

Impossible de trouver une réponse définitive. Je veux faire un indice 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. La manière correcte de taper un indice FuncAserait-elle:

def FuncA(arg: CustomClass):

Ou serait-ce:

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

hhprogramme
la source

Réponses:

125

Le premier est correct , s'il argaccepte une instance deCustomClass :

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

Au cas où vous voudriez la classe CustomClasselle - même (ou un sous-type) , vous devez écrire:

from typing import Type  # you have to import Type

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

Comme il est écrit dans la documentation sur la saisie :

class typing.Type(Generic[CT_co])

Une variable annotée avec Cpeut accepter une valeur de type C. En revanche, une variable annotée avec Type[C]peut accepter des valeurs qui sont elles - mêmes des classes - en particulier, elle acceptera l' objet de classe deC .

La documentation comprend un exemple avec la intclasse:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
la source
1
Est-ce Typede py3.6 et au-delà? Je viens de recevoir un NameError.
cs95
3
Notez que si vous avez la classe dans le même fichier, elle doit exister au moment où l'indice de type est évalué ...
576i
13
@ 576i: iirc, vous pouvez également utiliser une chaîne. Donc def foo(bar: 'Qux')équivaut à def foo(bar: Qux)sauf que cela ne nécessite pas de charger le type immédiatement.
Willem Van Onsem
2
@willem merci - je ne le savais pas. Quoi de mieux, l'auto-complétion pycharm fonctionne toujours.
576i
3
@ cs95 Oui. Tous les indices de type sont +3,7.
thiras