Kullanıcı tanımlı sınıflarla tip ipuçları


112

Kesin bir cevap bulamadım. Bir işlev için bir tür ipucu yapmak istiyorum ve bu tür, tanımladığım özel bir sınıftır CustomClass().

Ve sonra bir fonksiyonda diyelim, diyelim, FuncA(arg)isimli bir argümanım var arg. İpucu yazmanın doğru yolu şudur FuncA:

def FuncA(arg: CustomClass):

Ya da şöyle olur:

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

Yanıtlar:


137

İlki , aşağıdakilerin bir örneğini kabul ederse doğrudur :argCustomClass

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

Eğer istediğiniz sınıfı CustomClasskendisi (veya bir alt tipi) , o zaman yazmalısınız:

from typing import Type  # you have to import Type

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

Yazma ile ilgili belgelerde yazıldığı gibi :

class typing.Type(Generic[CT_co])

Açıklamalı bir değişken C, bir tür değerini kabul edebilir C. Buna karşılık, not eklenmişType[C] bir değişken , sınıfların kendileri olan değerleri kabul edebilir - özellikle sınıf nesnesiniC kabul eder .

Belgeler, intsınıfla bir örnek içerir :

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

1
Typepy3.6 ve öteki taraftan? Ben sadece bir NameError.
cs95

3
Aynı dosyada sınıfınız varsa, tür ipucunun değerlendirildiği anda var olması gerektiğini unutmayın ...
576i

14
@ 576i: iirc, bir dizi de kullanabilirsiniz. So def foo(bar: 'Qux'), def foo(bar: Qux)türün hemen yüklenmesini gerektirmemesi dışında eşdeğerdir .
Willem Van Onsem

2
@willem teşekkürler - Bunu bilmiyordum. En iyisi, pycharm otomatik tamamlama hala çalışıyor ..
576i

3
@ cs95 Evet. Tüm tür ipuçları +3,7'dir.
thiras
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.