2016-10-20 1 views
1

Ich habe eine Funktion ähnlich wie unten. Ich möchte, dass der Typhinweis Bar zurückgibt, aber das scheint ungültig zu sein. Gibt es eine Möglichkeit, dies zu tun, oder muss ich die Klasse außerhalb der Funktion verschieben, um sie als Rückgabetyp zu referenzieren?Python Typ Hinting, um Klasse in Funktion

def foo(i: int) -> Bar: 
    class Bar: 
     def __init__(i: int): 
      self.i = i 
    return Bar(i) 

Antwort

3

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) 
+0

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

+0

@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. –