Rekursives Schreiben in Python 3.5+ [duplizieren]

Diese Frage hat hier schon eine Antwort:

  • Wie kann ich angeben, dass der Rückgabetyp einer Methode die gleiche ist wie die Klasse selbst in Python? 2 antworten

In Python 3.5 wurden Typnotationen hinzugefügt (siehe hier ).

Gibt es eine Möglichkeit, rekursive Typ-Annotationen zu definieren, wie für eine baumartige Struktur?

class Employee(object): def __init__(self, name: str, reports: List[Employee]): self.name = name self.reports = reports 

Im obigen scheint es nicht, als ob die Annotation List[Employee] funktioniert. Das Ausführen des Codes führt zu diesem Fehler:

NameError: name 'Employee' is not defined

    One Solution collect form web for “Rekursives Schreiben in Python 3.5+ [duplizieren]”

    Sie können Vorwärtsreferenzen verwenden, wie in PEP 484 definiert

    Eine Situation, in der dies häufig vorkommt, ist die Definition einer Containerklasse, wobei die Klasse, die definiert wird, in der Signatur einiger Methoden auftritt. Zum Beispiel funktioniert der folgende Code (der Beginn einer einfachen Binärbaumimplementierung) nicht:

     class Tree: def __init__(self, left: Tree, right: Tree): self.left = left self.right = right 

    Um dies zu adressieren, schreiben wir:

     class Tree: def __init__(self, left: 'Tree', right: 'Tree'): self.left = left self.right = right 

    Es ist zulässig, String-Literale als Teil eines Typ-Hinweises zu verwenden, zum Beispiel:

     class Tree: ... def leaves(self) -> List['Tree']: 
    Python ist die beste Programmiersprache der Welt.