Digitare suggerimenti con classi definite dall'utente


103

Non riesco a trovare una risposta definitiva. Voglio fare un suggerimento sul tipo per una funzione e il tipo è una classe personalizzata che ho definito, chiamata CustomClass().

E poi diciamo in qualche funzione, chiamala FuncA(arg), ho un argomento chiamato arg. Il modo corretto di digitare hint FuncAsarebbe:

def FuncA(arg: CustomClass):

Oppure sarebbe:

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

Risposte:


125

Il primo è corretto , se argaccetta un'istanza diCustomClass :

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

Nel caso in cui desideri la classe CustomClassstessa (o un sottotipo) , dovresti scrivere:

from typing import Type  # you have to import Type

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

Come è scritto nella documentazione sulla digitazione :

class typing.Type(Generic[CT_co])

Una variabile annotata con Cpuò accettare un valore di tipo C. Al contrario, una variabile annotata con Type[C]può accettare valori che sono classi stesse - in particolare, accetterà l' oggetto classe diC .

La documentazione include un esempio con la intclasse:

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

1
È Typeda py3.6 e oltre? Ricevo solo un file NameError.
cs95

3
Nota che se hai la classe nello stesso file, deve esistere nel momento in cui viene valutato il suggerimento del tipo ...
576i

13
@ 576i: iirc, puoi anche usare una stringa. Quindi def foo(bar: 'Qux')è equivalente a def foo(bar: Qux)tranne che non richiede il caricamento immediato del tipo.
Willem Van Onsem

2
@willem grazie - non lo sapevo. La cosa migliore è che il completamento automatico di pycharm funziona ancora ..
576i

3
@ cs95 Sì. Tutti i suggerimenti sul tipo sono +3,7.
Thira
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.