Ich habe kürzlich etwas Interessantes beim Betrachten der Grammatikspezifikation von Python 3.3 bemerkt :
funcdef: 'def' NAME parameters ['->' test] ':' suite
Der optionale 'Pfeil'-Block fehlte in Python 2 und ich konnte keine Informationen bezüglich seiner Bedeutung in Python 3 finden. Es stellt sich heraus, dass dies korrektes Python ist und vom Interpreter akzeptiert wird:
def f(x) -> 123:
return x
Ich dachte, dass dies eine Art Voraussetzungssyntax sein könnte, aber:
- Ich kann hier nicht testen,
x
da es noch undefiniert ist, - Egal was ich nach dem Pfeil setze (zB
2 < 1
), es hat keinen Einfluss auf das Funktionsverhalten.
Könnte jemand, der mit dieser Syntax vertraut ist, es erklären?
.__annotations__
Attribut verfügbar .__annotations__
Attribut ist ein Wörterbuch. Der Schlüsselreturn
ist derjenige, mit dem der Wert nach dem Pfeil abgerufen wird.Dies sind Funktionsanmerkungen, die in PEP 3107 behandelt werden . Insbesondere
->
markiert das die Annotation der Rückgabefunktion.Beispiele:
Anmerkungen sind Wörterbücher. Sie können dies also tun:
Sie können auch eine Python-Datenstruktur anstelle einer Zeichenfolge verwenden:
Sie können auch Funktionsattribute verwenden, um aufgerufene Werte zu überprüfen:
Druckt
quelle
Wie in anderen Antworten angegeben, wird das
->
Symbol als Teil von Funktionsanmerkungen verwendet. In neueren Versionen von Python>= 3.5
hat es jedoch eine definierte Bedeutung.PEP 3107 - Funktionsanmerkungen beschreiben die Spezifikation, definieren die Grammatikänderungen, die Existenz,
func.__annotations__
in der sie gespeichert sind, und die Tatsache, dass der Anwendungsfall noch offen ist.In Python
3.5
hat PEP 484 - Type Hints jedoch eine einzige Bedeutung:->
Wird verwendet, um den Typ anzugeben, den die Funktion zurückgibt. Es scheint auch , wie dies in zukünftigen Versionen erzwungen werden , wie beschrieben Was derzeitige Verwendung von Anmerkungen :(Hervorhebung von mir)
3.6
Soweit ich das beurteilen kann, wurde dies noch nicht implementiert , sodass es möglicherweise zu zukünftigen Versionen kommt.Demnach haben Sie das folgende Beispiel angegeben:
wird in Zukunft verboten sein (und in aktuellen Versionen wird verwirrend sein), müsste es geändert werden zu:
Damit diese Funktion effektiv beschrieben werden kann, wird
f
ein Objekt vom Typ zurückgegebenint
.Die Anmerkungen werden von Python selbst in keiner Weise verwendet, sondern werden so gut wie ausgefüllt und ignoriert. Es liegt an Bibliotheken von Drittanbietern, mit ihnen zu arbeiten.
quelle
Im folgenden Code:
Das
-> int
Just sagt, dassf()
eine Ganzzahl zurückgegeben wird (aber es zwingt die Funktion nicht, eine Ganzzahl zurückzugeben). Es wird als Rückgabeanmerkung bezeichnet und kann als abgerufen werdenf.__annotations__['return']
.Python unterstützt auch Parameteranmerkungen:
: float
teilt Personen, die das Programm lesen (und einige Bibliotheken / Programme von Drittanbietern, z. B. Pylint), mit,x
dass afloat
. Es wird als zugegriffenf.__annotations__['x']
und hat für sich genommen keine Bedeutung. Weitere Informationen finden Sie in der Dokumentation:https://docs.python.org/3/reference/compound_stmts.html#function-definitions https://www.python.org/dev/peps/pep-3107/
quelle
Dies bedeutet, welche Art von Ergebnis die Funktion zurückgibt, aber es kann sein
None
.Es ist in modernen Bibliotheken, die auf Python 3.x ausgerichtet sind, weit verbreitet.
Zum Beispiel gibt es im Code der Bibliothek Pandas-Profiling an vielen Stellen zum Beispiel:
quelle
def function(arg)->123:
Es ist einfach ein Rückgabetyp, in diesem Fall spielt die Ganzzahl keine Rolle, welche Zahl Sie schreiben.
wie Java :
Aber für Python (wie Jim Fasarakis Hilliard sagte) ist der Rückgabetyp nur ein Hinweis , also schlägt er die Rückgabe vor, erlaubt aber trotzdem, einen anderen Typ wie einen String zurückzugeben.
quelle
Meine Zusammenfassung:
Es wird einfach
->
eingeführt, um Entwickler dazu zu bringen, optional den Rückgabetyp der Funktion anzugeben. Siehe Python-Erweiterungsvorschlag 3107Dies ist ein Hinweis darauf, wie sich die Dinge in Zukunft entwickeln könnten, wenn Python ausgiebig übernommen wird - ein Hinweis auf starkes Tippen - dies ist meine persönliche Beobachtung.
Sie können auch Typen für Argumente angeben. Durch Angabe des Rückgabetyps der Funktionen und Argumente können logische Fehler reduziert und Codeverbesserungen verbessert werden.
Sie können Ausdrücke als Rückgabetyp haben (sowohl auf Funktions- als auch auf Parameterebene), und auf das Ergebnis der Ausdrücke kann über das Attribut 'return' des Annotationsobjekts zugegriffen werden . Anmerkungen sind für den Ausdrucks- / Rückgabewert für Lambda-Inline-Funktionen leer.
quelle