Die Anmerkung ist bedeutungslos, weil Ihre Funktion Instanzen eine neuen, eindeutigen Bar
Klasse gibt jedes Mal aufgerufen wird.
Mit anderen Worten, es gibt keine eineBar
Klasse, gegen die Sie den Typ überprüfen können. Das Ergebnis von type(foo(1)) is type(foo(2))
ist wird immer falsch sein, so dass eine Überprüfung der Art gegen type(foo(1))
wird immer scheitern, wenn Sie in foo(2)
auch übergeben.
Wenn Sie auch hier anwenden Überprüfung möchten eingeben, werden Sie eine Basisklasse deklarieren müssen:
class BaseBar: pass
def foo(i: int) -> BaseBar:
class Bar(BaseBar):
def __init__(i: int):
self.i = i
return Bar(i)
Um dies ein wenig besser lesbar zu machen, könnte die Basisklasse nur Bar
benannt werden und die Funktion konnte produzieren Sie eine BarImpl
oder ConcreteBar
oder ähnliches. Auf diese Weise können Sie weiterhin Bar
in Typ Anmerkungen überall verwenden, um Verwirrung zu vermeiden.
Sie scheinen nicht wirklich benötigen, um jedes Mal eine neue Klasse zu erstellen; nichts in der Klasse ist parametrisiert oder verwendet Schließungen; wenn dies für den eigentlichen Code wahr ist, dann könnte man einfach definieren es außerhalb die Funktion:
class Bar:
def __init__(i: int):
self.i = i
def foo(i: int) -> Bar:
return Bar(i)
Es war nicht einmal fiel mir ein, dass ich jedes Mal eine neue Klasse wurde zu schaffen. Ich habe nur versucht, den Namespace nicht überladen zu lassen, aber wenn das korrekt ist, werde ich bessere Leistung erzielen, wenn ich die Klasse anderswo verschiebe und sie von dort aus anrufe. – Ajurna
@Ajurna: absolut. Eine 'Klasse ...:' Anweisung ist eine * ausführbare Anweisung *. Es wird ausgeführt, sobald Python darauf stößt. Module werden beim ersten Import ausgeführt und das resultierende Klassenobjekt wird dann auf globaler Ebene gespeichert. Hier erstellen Sie es als lokale Variable in einer Funktion und es wird jedes Mal ausgeführt, wenn die Funktion aufgerufen wird. –