Ketik petunjuk dengan kelas yang ditentukan pengguna

109

Sepertinya tidak dapat menemukan jawaban yang pasti. Saya ingin melakukan petunjuk tipe untuk suatu fungsi dan tipe tersebut menjadi beberapa kelas khusus yang telah saya tentukan, menyebutnya CustomClass().

Dan kemudian katakanlah di beberapa fungsi, sebut saja FuncA(arg), saya punya satu argumen bernama arg. Apakah cara yang benar untuk mengetik petunjuk FuncAadalah:

def FuncA(arg: CustomClass):

Atau apakah itu:

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

hhprogram
sumber

Jawaban:

130

Yang pertama benar , jika argmenerima contoh dariCustomClass :

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

Jika Anda menginginkan kelas CustomClassitu sendiri (atau subtipe) , maka Anda harus menulis:

from typing import Type  # you have to import Type

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

Seperti yang tertulis dalam dokumentasi tentang Mengetik :

class typing.Type(Generic[CT_co])

Variabel yang dianotasi Cdapat menerima nilai tipe C. Sebaliknya, variabel yang dianotasi Type[C]dapat menerima nilai yang merupakan kelas itu sendiri - khususnya, ia akan menerima objek kelasC .

Dokumentasi menyertakan contoh dengan intkelas:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
sumber
1
Apakah Typedari py3.6 dan seterusnya? Saya baru saja mendapatkan NameError.
cs95
3
Perhatikan bahwa jika Anda memiliki kelas dalam file yang sama, kelas itu harus ada pada saat petunjuk tipe dievaluasi ...
576i
13
@ 576i: iirc, Anda juga dapat menggunakan string. Jadi def foo(bar: 'Qux')sama dengan def foo(bar: Qux)kecuali bahwa itu tidak memerlukan pemuatan tipe segera.
Willem Van Onsem
2
@ Willem terima kasih - Saya tidak tahu itu. Yang terbaik, pelengkapan otomatis pycharm masih berfungsi ..
576i
3
@ cs. Ya. Semua petunjuk tipe adalah +3.7.
puluh