Umfang der Variablen in Python-Dekorateure – ändernde Parameter

Ich habe den folgenden Dekorateur mit Parametern:

from functools import wraps def pdecor(p): def decorator(fn): @wraps(fn) def wrapper(*args, **kwargs): p -= 1 return fn(*args, **wargs) return wrapper return decorator 

Der Versuch, den Dekorator zu verwenden, ergibt:

 >>> @pdecor(1) ... def run(): pass ... >>> run() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 5, in wrapper UnboundLocalError: local variable 'p' referenced before assignment >>> 

Warum kann ich das nicht ändern?

One Solution collect form web for “Umfang der Variablen in Python-Dekorateure – ändernde Parameter”

Weil du dem p innerhalb des wrapper , behandelt Python die p innere wrapper als lokal zum wrapper . In Python 3 kannst du nonlocal p , um p zu markieren, wie aus einem äußeren Bereich referenziert. In Python 2 gibt es keine Möglichkeit, dem Zwischenprodukt p zuzuordnen, obwohl man einen Verweis auf denselben Wert erhalten kann, indem er ihn in die verschachtelten Funktionen als Keyword-Argument übergibt (zB def decorator(fn, p=p) ).

Allerdings ist es nicht klar, was du damit nimmst. p ist schon nur lokal zu pdecor . Kein Code außerhalb pdecor kann auf p zugreifen, so dass dekrementiert wird es keine Auswirkungen auf irgendeinen Code an anderer Stelle haben. Also, ob du es dekrementieren kannst oder nicht, wird es nicht wirklich etwas erreichen.

  • Vorgehensweise der Parameternamen in Python
  • Python Dekorateure und Vererbung
  • Dekorieren von rekursiven Funktionen in Python
  • Wie würdest du einen @ debuggable decorator in python schreiben?
  • Anbringen eines Dekorators für alle Funktionen innerhalb einer Klasse
  • Ändern Sie ein Attribut einer Funktion in seinem eigenen Körper?
  • Catch "vor / nach Funktionsaufruf" Ereignisse für alle Funktionen in der Klasse
  • Python-Schließfunktion, die den äußeren variablen Zugriff verliert
  • Aufruf der Klasse statische Methode innerhalb der Klasse Körper?
  • Bevorzugte Art der Definition von Eigenschaften in Python: Immobilien Dekorateur oder Lambda?
  • Erhalten von Signaturen von dekorierten Funktionen
  • Python ist die beste Programmiersprache der Welt.