Während ich mich gerne als einigermaßen kompetenten Python-Codierer betrachte, ist ein Aspekt der Sprache, die ich nie beherrschen konnte, Dekorateure.
Ich weiß, was sie sind (oberflächlich), ich habe Tutorials, Beispiele und Fragen zum Stapelüberlauf gelesen und ich verstehe die Syntax, kann meine eigene schreiben, gelegentlich @classmethod und @staticmethod verwenden, aber mir fällt nie ein, a zu verwenden Dekorateur, um ein Problem in meinem eigenen Python-Code zu lösen. Ich stoße nie auf ein Problem, bei dem ich denke: "Hmm ... das sieht nach einem Job für einen Dekorateur aus!"
Ich frage mich also, ob ihr vielleicht einige Beispiele dafür anbietet, wo ihr Dekorateure in euren eigenen Programmen verwendet habt, und hoffentlich habe ich ein "A-ha!" Moment und hol sie dir .
functools.lru_cache
, der genau das tut, was Peter seit Python 3.2 im Februar 2011Antworten:
Ich benutze Dekorateure hauptsächlich für Timing-Zwecke
quelle
time.clock()
die CPU-Zeit. Möglicherweise möchtentime.time()
Sie stattdessen verwenden, wenn Sie die Wanduhrzeit messen möchten.myFunction
zu laufen ...Ich habe sie für die Synchronisation verwendet.
Wie in den Kommentaren erwähnt, können Sie seit Python 2.5 eine
with
Anweisung in Verbindung mit einem Objektthreading.Lock
(odermultiprocessing.Lock
seit Version 2.6) verwenden, um die Implementierung des Dekorateurs auf Folgendes zu vereinfachen:Unabhängig davon verwenden Sie es dann wie folgt:
Grundsätzlich wird nur
lock.acquire()
/lock.release()
auf beiden Seiten des Funktionsaufrufs platziert.quelle
Ich verwende Dekoratoren zur Typprüfung von Parametern, die über ein RMI an meine Python-Methoden übergeben werden. Anstatt die gleiche Parameterzählung zu wiederholen, wird immer wieder Mumbo-Jumbo ausgelöst.
Zum Beispiel anstelle von:
Ich erkläre nur:
und
accepts()
erledigt die ganze Arbeit für mich.quelle
@accepts
in PEP 318.isinstance()
Funktion, wie sie in der PEP 318- Implementierung des Decorators durchgeführt wird. Da es sich bei demclassinfo
Argument um einen oder mehrere Typen handeln kann, würde die Verwendung auch die (gültigen) Einwände von @ Gustavo6046 abschwächen. Python hat auch eineNumber
abstrakte Basisklasse, so dass sehr generische Tests wieisinstance(42, numbers.Number)
möglich möglich sind.Dekorateure werden für alles verwendet, was Sie transparent mit zusätzlichen Funktionen "umhüllen" möchten.
Django verwendet sie zum Umschließen der Funktionen "Anmeldung erforderlich" in Ansichtsfunktionen sowie zum Registrieren von Filterfunktionen .
Sie können Klassendekoratoren verwenden, um benannte Protokolle zu Klassen hinzuzufügen .
Jede ausreichend allgemeine Funktionalität, die Sie an das Verhalten einer vorhandenen Klasse oder Funktion "anheften" können, ist ein faires Spiel für die Dekoration.
Es gibt auch eine Diskussion über Anwendungsfälle in der Python-Dev-Newsgroup, auf die PEP 318 - Decorators for Functions and Methods hinweist .
quelle
Für Nasentests können Sie einen Dekorateur schreiben, der eine Unit-Test-Funktion oder -Methode mit mehreren Parametersätzen bereitstellt:
quelle
Die Twisted-Bibliothek verwendet Dekoratoren in Kombination mit Generatoren, um die Illusion zu erzeugen, dass eine asynchrone Funktion synchron ist. Zum Beispiel:
Auf diese Weise kann Code, der in eine Menge kleiner Rückruffunktionen aufgeteilt worden wäre, ganz natürlich als einzelner Block geschrieben werden, was das Verständnis und die Wartung erheblich vereinfacht.
quelle
Eine offensichtliche Verwendung ist natürlich die Protokollierung:
quelle
Ich verwende sie hauptsächlich zum Debuggen (Wrapper um eine Funktion, die ihre Argumente und Ergebnisse druckt) und zur Überprüfung (z. B. um zu überprüfen, ob ein Argument vom richtigen Typ ist oder ob der Benutzer im Fall einer Webanwendung über ausreichende Berechtigungen zum Aufrufen einer bestimmten Funktion verfügt Methode).
quelle
Ich verwende den folgenden Dekorator, um eine Funktion threadsicher zu machen. Dadurch wird der Code besser lesbar. Es ist fast ähnlich wie das von John Fouhy vorgeschlagene, aber der Unterschied besteht darin, dass man an einer einzelnen Funktion arbeitet und dass es nicht notwendig ist, ein Sperrobjekt explizit zu erstellen.
quelle
Dekorateure werden entweder verwendet, um die Eigenschaften einer Funktion zu definieren, oder als Boilerplate, das sie ändert. Es ist möglich, aber nicht intuitiv, völlig unterschiedliche Funktionen zurückzugeben. Wenn man sich die anderen Antworten hier ansieht, scheint es eine der häufigsten Anwendungen zu sein, den Umfang eines anderen Prozesses einzuschränken - sei es Protokollierung, Profilerstellung, Sicherheitsüberprüfungen usw.
CherryPy verwendet das Versenden von Objekten, um URLs mit Objekten und schließlich Methoden abzugleichen. Dekorateure dieser Methoden signalisieren, ob CherryPy diese Methoden überhaupt verwenden darf oder nicht . Zum Beispiel aus dem Tutorial angepasst :
quelle
Ich habe sie kürzlich verwendet, als ich an einer Webanwendung für soziale Netzwerke gearbeitet habe. Für Community / Gruppen sollte ich die Berechtigung zur Mitgliedschaft erteilen, um eine neue Diskussion zu erstellen und auf eine Nachricht zu antworten, dass Sie Mitglied dieser bestimmten Gruppe sein müssen. Also schrieb ich einen Dekorateur
@membership_required
und stellte das, was ich brauchte, in meine Sicht.quelle
Ich benutze diesen Dekorator, um Parameter zu korrigieren
Dies wurde geschrieben, wenn ich einige Funktionen umgestalte, die das Argument "wanN" übergeben müssen, aber in meinen alten Codes habe ich nur N oder 'N' übergeben
quelle
Mit Decorator können auf einfache Weise Funktionsmethodenvariablen erstellt werden.
quelle