Geben Sie Hinweise mit benutzerdefinierten Klassen ein

103

Konnte keine endgültige Antwort finden. Ich möchte einen Typhinweis für eine Funktion erstellen, und der Typ ist eine benutzerdefinierte Klasse, die ich definiert habe und die ich sie nenne CustomClass().

Und dann sagen wir in einer Funktion, nennen wir es FuncA(arg), ich habe ein Argument namens arg. Wäre die richtige Art, einen Hinweis einzugeben FuncA, Folgendes :

def FuncA(arg: CustomClass):

Oder wäre es:

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

hhprogram
quelle

Antworten:

124

Die erstere ist richtig , wenn argakzeptiert eine InstanzCustomClass :

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

Wenn Sie die Klasse CustomClassselbst (oder einen Subtyp) möchten , sollten Sie schreiben:

from typing import Type  # you have to import Type

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

Wie es in der Dokumentation über Typing geschrieben steht :

class typing.Type(Generic[CT_co])

Eine mit annotierte Variable Ckann einen Wert vom Typ annehmen C. Im Gegensatz dazu kann eine mit Annotationen verseheneType[C] Variable Werte akzeptieren, die selbst Klassen sind. Insbesondere akzeptiert sie das Klassenobjekt vonC .

Die Dokumentation enthält ein Beispiel mit der intKlasse:

a = 3         # Has type 'int'
b = int       # Has type 'Type[int]'
c = type(a)   # Also has type 'Type[int]'
Willem Van Onsem
quelle
1
Ist Typeab py3.6 und darüber hinaus? Ich bekomme nur eine NameError.
CS95
3
Beachten Sie, dass, wenn Sie die Klasse in derselben Datei haben, sie zum Zeitpunkt der Auswertung des
Typhinweises vorhanden sein muss
13
@ 576i: iirc, du kannst auch einen String verwenden. Dies def foo(bar: 'Qux')entspricht also der def foo(bar: Qux)Ausnahme, dass der Typ nicht sofort geladen werden muss.
Willem Van Onsem
2
@willem danke - das wusste ich nicht. Was ist das Beste, Pycharm Autocompletion funktioniert immer noch ..
576i
3
@ cs95 Ja. Alle Typhinweise sind +3.7.
Thiras