PEP 3107 (Funktionsanmerkungen)

Hallo alle zusammen. Ich habe mich entschlossen, die Python-Annotationen vollständig zu verstehen und gleichzeitig eine Reihe von PEPs zu übersetzen, die dieses Thema dokumentieren. Wir werden mit den 3.X-Standards beginnen und mit den Innovationen in Python 3.8 enden. Ich muss sofort sagen, dass dieses PEP eines der grundlegendsten ist und dass seine Lektüre nur für Anfänger nützlich ist. Also, lasst uns gehen:


PEP 572 - Funktionsanmerkungen

Pep3107
Titel:Funktionsanmerkungen
Autoren:Collin Winter <collinwinter at google.com>, Tony Lownds <tony at lownds.com>
Status:Finale
Eine Art:Standard
Erstellt:2. Dezember 2006
Python-Version:3.0

Anmerkung zum Standard


Dieses PEP führt die Syntax zum Hinzufügen beliebiger Anmerkungen (Metadaten) zu Funktionen in Python ein.

Rechtfertigung


Funktionen in Python 2.x hatten keine integrierte Möglichkeit, Parameter zu kommentieren und Werte zurückzugeben. Um diese Lücke zu schließen, sind viele Tools und Bibliotheken erschienen. Einige von ihnen verwenden die in PEP 318 beschriebenen Dekoratoren, während andere Docstring-Funktionen analysieren und dort nach Informationen suchen.

Dieses PEP soll eine einzige Standardmethode zum Kommentieren von Funktionen bieten, um die bis zu diesem Zeitpunkt bestehende Verwirrung zu verringern, die durch die großen Unterschiede in den Mechanismen und der Syntax verursacht wird.

Grundlagen der Funktionsanmerkung


Bevor wir uns mit Python 3.0-Funktionsanmerkungen befassen, wollen wir zunächst allgemein auf ihre Funktionen eingehen:

  1. Anmerkungen zu Parametern und Rückgabewerten von Funktionen sind vollständig optional.
  2. Anmerkungen sind nichts anderes als eine Möglichkeit, beliebige Ausdrücke zur Kompilierungszeit mit verschiedenen Teilen einer Funktion zu verknüpfen.

    Python selbst achtet nicht auf Anmerkungen. Das einzige, was Sie tun können, ist, dass Sie darauf zugreifen können. Dies wird im Abschnitt "Zugriff auf Funktionsanmerkungen" weiter unten beschrieben.

    Anmerkungen sind nur dann sinnvoll, wenn sie von Bibliotheken von Drittanbietern interpretiert werden. Mit Funktionsanmerkungen können sie tun, was sie wollen. Beispielsweise kann eine Bibliothek Zeichenfolgenanmerkungen verwenden, um verbesserte Referenzdaten bereitzustellen, zum Beispiel:

    def compile(source: "something compilable",
                filename: "where the compilable thing comes from",
                mode: "is this a single statement or a suite?"):
        ...

    Eine andere Bibliothek verwendet möglicherweise Python-Funktions- und Methodenanmerkungen, um die Typübereinstimmung zu überprüfen. Diese Bibliothek kann mithilfe von Anmerkungen anzeigen, welche Arten von Eingabedaten erwartet werden und welche Art von Daten zurückgegeben werden. Vielleicht wird es so etwas sein:

    def haul(item: Haulable, *vargs: PackAnimal) -> Distance:
        ...

    Wir wiederholen noch einmal: Die Anmerkungen von keinem der Beispiele an sich haben irgendeine Bedeutung. Sie erhalten nur in Kombination mit Bibliotheken von Drittanbietern eine echte Bedeutung.
  3. Wie aus Absatz 2 hervorgeht, versucht dieses PEP nicht, einen Standardmechanismus für die Verarbeitung von Anmerkungen einzuführen, selbst für integrierte Typen. All diese Arbeiten werden Bibliotheken von Drittanbietern zugewiesen.

Syntax


Parameter


Parameteranmerkungen sind optionale Ausdrücke, die dem Namen des Parameters selbst folgen:

def foo (a: , b:  = 5):
    ...

In der Pseudogrammatik sehen Parameter jetzt wie folgt aus: Parameter [: Ausdruck] [= Ausdruck] . Das heißt, Anmerkungen sind wie Standardwerte optional und stehen immer vor letzteren. Genau wie ein Gleichheitszeichen verwendet wird, um einen Standardwert anzugeben, wird ein Doppelpunkt für Anmerkungen verwendet. Alle Anmerkungsausdrücke werden wie Standardwerte ausgewertet, wenn eine Funktionsdefinition ausgeführt wird. Das Abrufen von "zusätzlichen" Argumenten (dh * args und ** kwargs) hat dieselbe Syntax:

def foo(*args: expression, **kwargs: expression):
    ...

Anmerkungen für verschachtelte Parameter folgen immer dem Parameternamen, nicht der letzten Klammer. Die Angabe jedes "Namens" im verschachtelten Parameter ist nicht erforderlich:

def foo((x1, y1: expression),
        (x2: expression, y2: expression)=(None, None)):
    ...

Rückgabewerte


Bisher haben wir kein Beispiel für die Annotation des Rückgabetyps in Funktionen bereitgestellt. Dies geschieht folgendermaßen:

def sum() -> expression:
    ...

Das heißt, das Literal -> und eine Art Ausdruck können nun der Liste der Parameter folgen. Wie Parameteranmerkungen wird dieser Ausdruck ausgewertet, wenn die Funktionsdefinition ausgeführt wird.

Die vollständige Grammatik der Funktionsdeklarationen lautet nun wie folgt:

decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
decorators: decorator+
funcdef: [decorators] 'def' NAME parameters ['->' test] ':' suite
parameters: '(' [typedargslist] ')'
typedargslist: ((tfpdef ['=' test] ',')*
                ('*' [tname] (',' tname ['=' test])* [',' '**' tname]
                 | '**' tname)
                | tfpdef ['=' test] (',' tfpdef ['=' test])* [','])
tname: NAME [':' test]
tfpdef: tname | '(' tfplist ')'
tfplist: tfpdef (',' tfpdef)* [',']

Lambdas


Lambda-Funktionen unterstützen keine Anmerkungen. Natürlich könnte die Syntax korrigiert werden, indem die Möglichkeit hinzugefügt wird, die Argumente in Klammern zu "wickeln". Es wurde jedoch beschlossen, eine solche Änderung nicht vorzunehmen, weil:

  1. Dies würde die Abwärtskompatibilität verletzen.
  2. Lambdas sind per Definition neutral und anonym
  3. Lambdas können immer als Funktionen umgeschrieben werden


Erhalten Sie Zugriff auf Funktionsanmerkungen


Nach der Kompilierung werden Funktionsanmerkungen über das Attribut __annotations__ verfügbar. Dieses Attribut ist ein veränderbares Wörterbuch, das die Namen von Variablen und die Werte der ihnen angegebenen Anmerkungen vergleicht.

Das __annotations__-Wörterbuch verfügt über einen speziellen "Return" -Schlüssel. Dieser Schlüssel ist nur vorhanden, wenn auch für den Rückgabewert der Funktion eine Anmerkung definiert wurde. Zum Beispiel die folgende Anmerkung:

def foo (a: 'x', b: 5 + 6, c: list) -> max (2, 9):
    ...

Wird über das Attribut __annotations__ zurückgegeben als:

{'a': 'x',
 'b': 11,
 'c': list,
 'return': 9}

Der Schlüsselname "return" wurde ausgewählt, da er nicht mit dem Parameternamen in Konflikt stehen kann (jeder Versuch, return als Parameternamen zu verwenden, führt zu einer SyntaxError-Ausnahme).

Das Attribut __annotations__ ist leer, wenn die Funktion keine Anmerkungen enthält oder wenn die Funktion über einen Lambda-Ausdruck erstellt wurde.

Anwendungsfälle


Während der Diskussion der Anmerkungen haben wir verschiedene Optionen für ihre Verwendung untersucht. Einige von ihnen werden hier vorgestellt und nach der "Klasse" der übertragenen Informationen gruppiert. Hier finden Sie auch Beispiele für vorhandene Produkte und Pakete, die Anmerkungen verwenden können.

  • Typinformationen bereitstellen
    • Typprüfung
    • IDE-Tipps zu erwarteten und zurückgegebenen Argumenttypen
    • Funktionsüberladung / generische Funktionen [ca. Funktionsüberladung ist in anderen Sprachen beliebt und besteht in der Existenz mehrerer Funktionen mit demselben Namen, aber gleichzeitig variiert die Anzahl der von ihnen akzeptierten Parameter.]
    • Brücken zwischen verschiedenen Programmiersprachen
    • Anpassung
    • Prädikatenlogikfunktionen
    • Zuordnung einer Datenbankabfrage
    • RPC-Parameter-Marshalling [ca. Beim Marshaling werden im RAM gespeicherte Informationen in ein Format konvertiert, das zum Speichern oder Übertragen geeignet ist. RPC - Remote Procedure Call]
  • Bereitstellung anderer Informationen
    • Parameter und Rückgabewerte dokumentieren

Standardbibliothek


Pydoc und überprüfen Sie die Module


Das pydoc-Modul zeigt Anmerkungen in den Funktionsreferenzinformationen an. Das Inspect-Modul ändert sich und unterstützt Anmerkungen.

Link zu anderen PEPs


Funktionssignaturobjekte


Funktionssignaturobjekte müssen Funktionsanmerkungen enthalten. Parameterobjekt und andere Dinge können sich ändern. [ca. Unterschrift (Unterschrift) der Funktion - Teil ihrer allgemeinen Erklärung, die es den Übersetzungsmitteln ermöglicht, die Funktion unter anderem zu identifizieren]

Implementierung


Die Referenzimplementierung wurde als Revision 53170 in den Zweig py3k (ehemals „p3yk“) aufgenommen

Abgelehnte Angebote


  • BDFL [. ] , , : « »
  • stdlib , , . .
  • , , .
  • Trotz weiterer Diskussion wurde beschlossen, den Mechanismus für die Annotationsinteraktion nicht zu standardisieren. Eine solche Vereinbarung wäre zu diesem Zeitpunkt verfrüht. Wir möchten, dass sich diese Vereinbarungen auf der Grundlage einer realen Situation organisch entwickeln, und nicht versuchen, alle dazu zu zwingen, ein erfundenes System anzuwenden.

All Articles