Über Dekorateure in Python

Hallo allerseits!


Die Übersetzung des Artikels wurde für Studenten des Kurses "Webentwickler in Python" vorbereitet. Ist es interessant, sich in diese Richtung zu entwickeln? Melden Sie sich für den Open Doors Day-Kurs an und unterhalten Sie sich live mit dem Lehrer: Online-Übertragung am 23. Juli um 20:00 Uhr Moskauer Zeit!



Wenn Sie das Programmieren in Python geübt haben, müssen Sie auf ein Konzept wie Dekorateure gestoßen sein. Sie sind eines der elegantesten und am häufigsten verwendeten Werkzeuge in modernen Bibliotheken und Frameworks. Dekorateure sind eine gute Möglichkeit, viele Implementierungsdetails zusammenzufassen und eine einfache Oberfläche auf der Oberfläche zu belassen.


Schauen wir uns ein Beispiel eines einfachen Login-Dekorateurs an, der überprüft, ob ein Benutzer angemeldet ist, bevor er die Möglichkeit erhält, Beiträge zu bearbeiten. Anschließend leitet der Dekorateur zur Anmelde- oder Registrierungsseite weiter und kehrt nach erfolgreicher Authentifizierung mithilfe korrekt eingestellter Parameter auf dieselbe Seite zurück. Um diese Funktion zu verwenden, müssen Sie nur @login_required vor der Zielfunktion schreiben.


@login_required def edit_post(post_id): ... 

Dekoratoren sind sehr einfach zu bearbeiten, aber das Erstellen von Dekoratoren ist selbst für erfahrene Python-Programmierer keine leichte Aufgabe. In diesem Artikel werden wir uns Schritt für Schritt mit der Funktionsweise von Dekoratoren in Python befassen.


Funktionen


Funktionen werden in Python auch als erstklassige Objekte bezeichnet. Funktionen sind dieselben Werte wie Zahlen, Listen und Zeichenfolgen, wie im folgenden Beispiel dargestellt.


 >>> def foo(): ... return 1 ... >>> >>> foo() 1 >>> 

Funktionen haben einen eigenen Namespace, in dem sie zuerst nach Variablennamen suchen, wenn sie im Hauptteil einer Funktion vorkommen. Schreiben wir eine einfache Funktion, um den Unterschied zwischen globalem und lokalem Bereich zu verstehen.


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(locals()) ... >>> >>> print(globals()) {..., 'a_string': 'This is a global variable'} >>> >>> foo() # 2 {} >>> 

Funktionsumfang als Variable


Die Bereichsregel in Python besagt, dass beim Erstellen einer Variablen immer eine neue lokale Variable erstellt wird, der Zugriff auf die Variable jedoch im lokalen Bereich festgelegt wird, wenn alle nahe gelegenen Bereiche nach übereinstimmenden Variablennamen durchsucht werden. Dies bedeutet nicht, dass wir von unserer Funktion aus nicht auf globale Variablen zugreifen können. Um eine globale Variable auszugeben, ändern wir die Funktion foo wie folgt:


 >>> >>> a_string = "This is a global variable" >>> >>> def foo(): ... print(a_string) #1 ... >>> >>> foo() This is a global variable >>> 

Variable Lebensdauer


Im Namespace leben nicht nur Variablen, sondern sie haben auch eine Lebensdauer, an die Sie sich unbedingt erinnern sollten. Stellen Sie sich ein Beispiel vor, das nicht nur die Bereichsregeln und die Probleme veranschaulicht, die sie verursachen können, sondern auch, wie sie mit Funktionsaufrufen interagieren und wie sie in Python und anderen Sprachen funktionieren.


 >>> def foo(): ... x = 1 ... >>> foo() >>> >>> print(x) # 1 Traceback (most recent call last): ... NameError: name 'x' is not defined >>> 

Verschachtelte Funktionen


In Python können Sie verschachtelte Funktionen erstellen. Dies bedeutet, dass wir Funktionen innerhalb von Funktionen deklarieren können und alle Regeln für Umfang und Lebensdauer weiterhin gelten.


 >>> >>> def outer(): ... x = 1 ... def inner(): ... print(x) # 1 ... inner() # 2 ... >>> outer() 1 >>> 

Dekorateure


Ein Abschluss, der eine Funktion als Parameter verwendet und eine Funktion zurückgibt, wird als Dekorator bezeichnet. Betrachten Sie ein Beispiel für nützliche Dekorateure.


 >>> >>> def outer(some_func): ... def inner(): ... print("before some_func") ... ret = some_func() # 1 ... return ret + 1 ... return inner ... >>> def foo(): ... return 1 ... >>> decorated = outer(foo) # 2 >>> >>> decorated() before some_func 2 >>> 

Eine dekorierte Variable ist eine dekorierte Version von foo. Tatsächlich könnten wir foo durch seine dekorierte Version ersetzen und die neue Syntax nicht lernen, indem wir einfach die Variable neu zuweisen, die unsere Funktion enthält:


 >>> >>> foo = outer(foo) >>> >>> foo # doctest: +ELLIPSIS <function outer.<locals>.inner at 0x...> >>> 

Jetzt haben wir einen schönen Dekorator zum Verfolgen von Funktionsaufrufen. Dekorateure können verwendet werden, um mit Python mit jeder Programmiersprache zu arbeiten. Dies ist ein äußerst nützliches Werkzeug, dessen Arbeitsmechanismus verstanden werden muss, um sie korrekt anzuwenden.

Source: https://habr.com/ru/post/de460931/


All Articles