Ich schaue mir einen Python-Code an, der das @
Symbol verwendet, aber ich habe keine Ahnung, was er tut. Ich weiß auch nicht, wonach ich suchen soll, da die Suche in Python-Dokumenten oder Google keine relevanten Ergebnisse zurückgibt, wenn das @
Symbol enthalten ist.
python
syntax
python-decorators
AJ00200
quelle
quelle
Beispiel
Dies zeigt, dass das
function
/method
/, dasclass
Sie nach einem Dekorateur definieren, im Grunde genommen als /argument
an dasfunction
/method
unmittelbar nach dem@
Zeichen weitergegeben wird.Erste Sichtung
Die Mikroframework- Flasche stellt Dekorateure von Anfang an in folgendem Format vor:
Dies bedeutet wiederum:
Als ich das erkannte, konnte ich mich endlich in Frieden mit Flask fühlen.
quelle
app.route("/")
: Diese Funktion gibt eine Funktion zurück, die Sie mit Ihremhello()
als Argumentapp.route("/", hello)
unmittelbar nach dem Definieren aufzurufenhello
oder sogarhello
als Lambda in den Argumenten zu definierenapp.route
? (Das letztere Beispiel ist bei Node.js-http.Server
und Express-Routen üblich.)Dieser Code-Ausschnitt:
Entspricht diesem Code:
In der Definition eines Dekorateurs können Sie einige modifizierte Dinge hinzufügen, die von einer Funktion normalerweise nicht zurückgegeben werden.
quelle
In Python 3.5 können Sie
@
als Operator überladen . Es heißt__matmul__
, weil es für die Matrixmultiplikation ausgelegt ist, aber es kann alles sein, was Sie wollen. Siehe PEP465 für Details.Dies ist eine einfache Implementierung der Matrixmultiplikation.
Dieser Code ergibt:
quelle
@=
Operator (an Ort und Stelle)__imatmul__
.__add__
und bin__sub__
mit + bzw. - verbunden, habe aber noch nie von dem@
Zeichen 1 gehört. Lauern da draußen noch andere?Was macht das "at" (@) -Symbol in Python?
Kurz gesagt, es wird in der Decorator-Syntax und zur Matrixmultiplikation verwendet.
Im Kontext von Dekorateuren lautet diese Syntax:
ist gleichbedeutend damit:
Im Zusammenhang mit der Matrixmultiplikation,
a @ b
aufrufta.__matmul__(b)
- so dass diese Syntax:gleichwertig
und
gleichwertig
wo
dot
ist zum Beispiel die Numpy-Matrix-Multiplikationsfunktion unda
undb
sind Matrizen.Wie können Sie das selbst entdecken?
Wenn Sie einen ziemlich vollständigen Überblick über die Funktionsweise einer bestimmten Python-Syntax erhalten möchten, sehen Sie sich direkt die Grammatikdatei an. Für den Python 3-Zweig:
Wir können hier sehen, dass
@
in drei Zusammenhängen verwendet wird:Decorator-Syntax:
Eine Google-Suche nach "Decorator Python Docs" liefert als eines der Top-Ergebnisse den Abschnitt "Compound Statements" der "Python Language Reference". Wenn wir zu dem Abschnitt über Funktionsdefinitionen scrollen , den wir finden können, indem wir nach dem Wort "Dekorateur" suchen, sehen wir, dass ... es viel zu lesen gibt. Aber das Wort "Dekorateur" ist ein Link zum Glossar , das uns sagt:
Das sehen wir also
ist semantisch dasselbe wie:
Sie sind nicht genau gleich, da Python den foo-Ausdruck (der eine gepunktete Suche und ein Funktionsaufruf sein kann) vor dem Balken mit der decorator (
@
) -Syntax auswertet, im anderen Fall jedoch den foo-Ausdruck nach dem Balken auswertet .(Wenn dieser Unterschied die Bedeutung Ihres Codes beeinflusst, sollten Sie überlegen, was Sie mit Ihrem Leben machen, da dies pathologisch wäre.)
Gestapelte Dekorateure
Wenn wir zur Dokumentation der Funktionsdefinitionssyntax zurückkehren, sehen wir:
Dies ist eine Demonstration, dass wir eine Funktion, die zuerst ein Dekorateur ist, sowie Stapeldekoratoren aufrufen können. Funktionen in Python sind erstklassige Objekte. Dies bedeutet, dass Sie eine Funktion als Argument an eine andere Funktion übergeben und Funktionen zurückgeben können. Dekorateure machen beides.
Wenn wir Dekoratoren stapeln, wird die definierte Funktion zuerst an den Dekorator unmittelbar darüber übergeben, dann an den nächsten und so weiter.
Das fasst die Verwendung
@
im Kontext von Dekorateuren zusammen.Der Betreiber,
@
Im Abschnitt zur lexikalischen Analyse der Sprachreferenz haben wir einen Abschnitt zu Operatoren , der Folgendes enthält
@
, wodurch es auch zu einem Operator wird:und auf der nächsten Seite, dem Datenmodell, haben wir den Abschnitt Emulieren numerischer Typen ,
Und wir sehen, dass das
__matmul__
entspricht@
. Wenn wir die Dokumentation nach "matmul" durchsuchen, erhalten wir einen Link zu den Neuerungen in Python 3.5 mit "matmul" unter der Überschrift "PEP 465 - Ein dedizierter Infix-Operator für die Matrixmultiplikation".(Jetzt erfahren wir also, dass dies
@=
die In-Place-Version ist.) Es erklärt weiter:Während dieser Operator für fast alles überladen werden kann
numpy
, würden wir beispielsweise diese Syntax verwenden, um das innere und äußere Produkt von Arrays und Matrizen zu berechnen:Inplace-Matrixmultiplikation:
@=
Bei der Untersuchung der vorherigen Verwendung stellen wir fest, dass es auch die Inplace-Matrix-Multiplikation gibt. Wenn wir versuchen, es zu verwenden, stellen wir möglicherweise fest, dass es für numpy noch nicht implementiert ist:
Wenn es implementiert ist, würde ich erwarten, dass das Ergebnis so aussieht:
quelle
@ Symbol ist ein syntaktischer Zucker Python zu nutzen bietet
decorator
, umdie Frage zu paraphrasieren, über Es ist genau das, was tut Dekorateur in Python tun?
Vereinfacht ausgedrückt
decorator
können Sie die Definition einer bestimmten Funktion ändern, ohne das Innerste zu berühren (das Schließen).Dies ist der häufigste Fall, wenn Sie ein wunderbares Paket von einem Drittanbieter importieren. Sie können es visualisieren, Sie können es verwenden, aber Sie können sein Innerstes und sein Herz nicht berühren.
Hier ein kurzes Beispiel:
Angenommen, ich definiere eine
read_a_book
Funktion in IpythonSie sehen, ich habe vergessen, einen Namen hinzuzufügen.
Wie kann man ein solches Problem lösen? Natürlich könnte ich die Funktion neu definieren als:
Was aber, wenn ich die ursprüngliche Funktion nicht manipulieren darf oder wenn Tausende solcher Funktionen bearbeitet werden müssen?
Lösen Sie das Problem, indem Sie anders denken und eine neue Funktion definieren
Dann setzen Sie es ein.
Tada, siehst du, ich habe es geändert,
read_a_book
ohne es zu berühren. Nichts hält mich davon abdecorator
.Was ist mit
@
@add_a_book
ist eine ausgefallene und praktische Art zu sagenread_a_book = add_a_book(read_a_book)
, es ist ein syntaktischer Zucker, nichts ist schicker daran.quelle
Wenn Sie sich auf Code in einem Python-Notizbuch beziehen, das die Numpy- Bibliothek verwendet,
@ operator
bedeutet dies Matrix-Multiplikation . Zum Beispiel:quelle
Ab Python 3.5 wird das '@' als dediziertes Infix-Symbol für MATRIX MULTIPLICATION verwendet (PEP 0465 - siehe https://www.python.org/dev/peps/pep-0465/ ).
quelle
In Python wurden Dekoratoren hinzugefügt, um das Umschließen von Funktionen und Methoden (eine Funktion, die eine Funktion empfängt und eine erweiterte zurückgibt) einfacher zu lesen und zu verstehen. Der ursprüngliche Anwendungsfall bestand darin, die Methoden als Klassenmethoden oder statische Methoden am Kopf ihrer Definition definieren zu können. Ohne die Decorator-Syntax wäre eine eher spärliche und sich wiederholende Definition erforderlich:
Wenn die Decorator-Syntax für denselben Zweck verwendet wird, ist der Code kürzer und leichter zu verstehen:
Allgemeine Syntax und mögliche Implementierungen
Der Dekorator ist im Allgemeinen ein benanntes Objekt ( Lambda-Ausdrücke sind nicht zulässig ), das beim Aufruf ein einzelnes Argument akzeptiert (dies ist die dekorierte Funktion) und ein anderes aufrufbares Objekt zurückgibt. "Callable" wird hier anstelle von "function" mit Vorsatz verwendet. Während Dekorateure häufig im Rahmen von Methoden und Funktionen diskutiert werden, sind sie nicht auf diese beschränkt. Tatsächlich kann alles, was aufrufbar ist (jedes Objekt, das die _call__-Methode implementiert, als aufrufbar betrachtet wird), als Dekorator verwendet werden, und häufig sind von ihnen zurückgegebene Objekte keine einfachen Funktionen, sondern mehr Instanzen komplexerer Klassen, die ihre eigene __call_-Methode implementieren.
Die Dekorationssyntax ist einfach nur ein syntaktischer Zucker . Betrachten Sie die folgende Verwendung des Dekorateurs:
Dies kann immer durch einen expliziten Aufruf des Dekorateurs und eine Neuzuweisung der Funktionen ersetzt werden:
Letzteres ist jedoch weniger lesbar und auch sehr schwer zu verstehen, wenn mehrere Dekorateure für eine einzelne Funktion verwendet werden. Dekorateure können auf verschiedene Arten verwendet werden, wie unten gezeigt:
Als eine Funktion
Es gibt viele Möglichkeiten, benutzerdefinierte Dekoratoren zu schreiben. Am einfachsten ist es jedoch, eine Funktion zu schreiben, die eine Unterfunktion zurückgibt, die den ursprünglichen Funktionsaufruf umschließt.
Die generischen Muster sind wie folgt:
Als eine Klasse
Während Dekorateure fast immer mithilfe von Funktionen implementiert werden können, gibt es Situationen, in denen die Verwendung benutzerdefinierter Klassen eine bessere Option ist. Dies ist häufig der Fall, wenn der Dekorateur eine komplexe Parametrisierung benötigt oder von einem bestimmten Zustand abhängt.
Das generische Muster für einen nicht parametrisierten Dekorateur als Klasse lautet wie folgt:
Dekorateure parametrisieren
In echtem Code müssen häufig Dekoratoren verwendet werden, die parametrisiert werden können. Wenn die Funktion als Dekorateur verwendet wird, ist die Lösung einfach: Es muss eine zweite Umhüllungsstufe verwendet werden. Hier ist ein einfaches Beispiel für den Dekorateur, der die Ausführung einer dekorierten Funktion bei jedem Aufruf so oft wiederholt:
Der so definierte Dekorateur kann folgende Parameter akzeptieren:
Beachten Sie, dass selbst wenn der parametrisierte Dekorator Standardwerte für seine Argumente hat, die Klammern nach seinem Namen erforderlich sind. Der korrekte Weg, den vorhergehenden Dekorator mit Standardargumenten zu verwenden, ist wie folgt:
Zum Schluss sehen wir Dekorateure mit Eigenschaften.
Eigenschaften
Die Eigenschaften bieten einen integrierten Deskriptortyp , der weiß, wie ein Attribut mit einer Reihe von Methoden verknüpft wird. Eine Eigenschaft akzeptiert vier optionale Argumente: fget, fset, fdel und doc. Die letzte kann bereitgestellt werden, um eine Dokumentzeichenfolge zu definieren, die mit dem Attribut verknüpft ist, als wäre es eine Methode. Hier ist ein Beispiel für eine Rechteckklasse, die entweder durch direkten Zugriff auf Attribute, in denen zwei Eckpunkte gespeichert sind, oder mithilfe der Eigenschaften width und height gesteuert werden kann:
Die beste Syntax zum Erstellen von Eigenschaften ist die Verwendung von Eigenschaften als Dekorator. Dadurch wird die Anzahl der Methodensignaturen innerhalb der Klasse verringert und der Code lesbarer und wartbarer . Mit Dekorateuren wird die obige Klasse:
quelle
Um zu sagen, was andere anders haben: Ja, es ist ein Dekorateur.
In Python ist es wie:
Dies kann für alle Arten von nützlichen Dingen verwendet werden, die ermöglicht werden, weil Funktionen Objekte sind und nur notwendige Anweisungen erforderlich sind.
quelle
Das @ -Symbol wird auch verwendet, um auf Variablen in einer Plydata / Pandas-Datenrahmenabfrage zuzugreifen
pandas.DataFrame.query
. Beispiel:quelle
Es zeigt an, dass Sie einen Dekorateur verwenden. Hier ist das Beispiel von Bruce Eckel aus dem Jahr 2008.
quelle