2013-04-06 9 views
48

In Python 3 kann ich Argumente und Rückgabetyp Anmerkungen machen. Beispiel:putting aktuelle Klasse als Rückgabetyp Annotation

class Graph: 
    def __init__(self, V: int, E: int, edges: list): 
     pass 

    @classmethod 
    def fromfile(cls, readobj: type(sys.stdin)): 
     pass 

    def V(self) -> int: 
     pass 

    def E(self) -> int: 
     pass 

Das Problem ist, ich nicht eine Anmerkung mit Rückgabetyp der aktuellen Klasse (Grafik) machen kann, die noch nicht definiert ist. Beispiel:

class Graph: 
    def reverse(self) -> Graph: 
     pass 

Dieser Code geht mit Fehler

def reverse(self) -> Graph: 
NameError: name 'Graph' is not defined 

Diese Anmerkungen wirklich nützlich sind, sowohl für die Dokumentation und ermöglicht IDE Argument zu erkennen und Rückgabetypen => zur automatischen Vervollständigung

UPD aktivieren: Also, was ich herausgefunden habe, ist entweder unmöglich oder erfordert einige Hacks, die ich nicht mag, also entschied ich mich, nur def reverse (self) -> 'Graph': zu verwenden, was für documenta verständlich ist obwohl die Regel bricht. Der Nachteil ist, dass es nicht für die automatische Vervollständigung der IDE funktioniert.

+0

Haben Sie versucht: 'def reverse (self) -> Typ (self)' – Ankur

+0

möglich Duplikat von [Warum wird der Name der enthaltenden Klasse nicht als Annotation der Rückgabewertfunktion erkannt?] (Http: // stackoverflow. com/questions/15741887/why-ist-der-Name-der-enthaltenden-Klasse-nicht-erkannt-als-Rückgabewert-Funktion) – eryksun

+2

Mögliche Duplikat von [Wie gebe ich an, dass der Rückgabetyp von eine Methode ist das gleiche wie die Klasse selbst in Python?] (https://stackoverflow.com/questions/33533148/how-do-i-specify-that-the-return-type-of-a-methodis- the-self-as-the-class-itsel) –

Antwort

29

So jetzt nach einer Weile kann ich sagen, dass die Entscheidung, die ich nahm, war -> 'Graph' anstelle von -> Graph. Es macht meine IDE (PyCharm) nicht in der Lage, einen Typ auf diese Weise zu erkennen, aber es funktioniert einfach gut genug für Dokumentationszwecke.

Eine andere mögliche Lösung, die ich verwenden könnte Anmerkung zur Laufzeit änderte sich aber das löst nicht das Problem mit der Dokumentation - Sie werden nicht für Typdeklarationen irgendwo in der Mitte der Quellen aussehen wollen ...

Die Problem hat Wurzeln in der Erkennung von Klassenobjekt, bevor die Klasse tatsächlich definiert wurde. Das ist in Python einfach unmöglich.

+19

Eigentlich ist dies eine korrekte Lösung für ein Problem, das als Forward-Referenzen bekannt ist - https://www.python.org/dev/peps/pep-0484/#forward-references . Und die aktuelle Version von PyCharm (in der Zeit, in der dieser Kommentar geschrieben wurde) erkennt einen Typus, der geschrieben wurde und bietet alle notwendige Unterstützung. –

Verwandte Themen