Wpisz podpowiedzi z klasami zdefiniowanymi przez użytkownika

109

Nie mogłem znaleźć ostatecznej odpowiedzi. Chcę zrobić wskazówkę dotyczącą typu dla funkcji, a typ jest jakąś niestandardową klasą, którą zdefiniowałem, nazywa ją CustomClass().

A potem powiedzmy, że w jakiejś funkcji, nazwij ją FuncA(arg), mam jeden argument o nazwie arg. Czy poprawnym sposobem wpisania podpowiedzi FuncAbyłby:

def FuncA(arg: CustomClass):

Czy byłoby to:

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

hhprogram
źródło

Odpowiedzi:

130

Pierwsza z nich jest poprawna , jeśli argakceptuje przykładCustomClass :

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

Jeśli chcesz samą klasę CustomClass(lub podtyp) , powinieneś napisać:

from typing import Type  # you have to import Type

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

Tak jak jest napisane w dokumentacji dotyczącej pisania :

class typing.Type(Generic[CT_co])

Zmienna z adnotacją Cmoże przyjmować wartość typu C. Natomiast zmienna z adnotacją Type[C]może akceptować wartości, które same są klasami - w szczególności przyjmie obiekt klasyC .

Dokumentacja zawiera przykład z intklasą:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
źródło
1
Jest Typez py3.6 i dalej? Po prostu dostaję NameError.
cs95
3
Zwróć uwagę, że jeśli masz klasę w tym samym pliku, musi ona istnieć w momencie oceny wskazówki dotyczącej typu ...
576i
13
@ 576i: iirc, możesz też użyć łańcucha. Więc def foo(bar: 'Qux')jest równoważne z def foo(bar: Qux)wyjątkiem tego, że nie wymaga natychmiastowego ładowania typu.
Willem Van Onsem
2
@willem thanks - tego nie wiedziałem. Co najlepsze, autouzupełnianie pycharm nadal działa ..
576i
3
@ cs95 Yes. Wszystkie wskazówki dotyczące typów to +3,7.
thiras