Heim >Backend-Entwicklung >Python-Tutorial >Wie bleiben Funktionssignaturen bei der Verwendung von Dekoratoren in Python erhalten?
Signaturen dekorierter Funktionen beibehalten
Dekoratoren sind ein leistungsstarkes Werkzeug zur Verbesserung der Funktionalität von Python-Funktionen. Allerdings können sie manchmal die Signatur der ursprünglichen Funktion verdecken. Dies kann für Dokumentation, Debugging und automatisierte Tools problematisch sein.
Problem:
Stellen Sie sich einen generischen Dekorator vor, der alle Argumente in Ganzzahlen umwandelt:
<code class="python">def args_as_ints(f): def g(*args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return f(*args, **kwargs) return g</code>
Während die Dekoration wie erwartet funktioniert, wird die Signatur der dekorierten Funktion durch „args, *kwargs“ ersetzt, wodurch Informationen über die ursprünglichen Argumente verloren gehen.
Problemumgehungen:
Es gibt mehrere Problemumgehungen, aber keine ist vollständig zufriedenstellend:
Lösung:
Decorator-Modul bietet eine elegante Lösung:
<code class="python">import decorator @decorator.decorator def args_as_ints(f, *args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return f(*args, **kwargs)</code>
Dieser Dekorator behält die Signatur der ursprünglichen Funktion bei, indem er sie als Argumente an die umschlossene Funktion übergibt.
Verbesserter Dekorator:
<code class="python">@args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z</code>
Jetzt bleibt die dekorierte Funktion „funkey_function“ erhalten seine ursprüngliche Signatur:
>>> help(funny_function) Help on function funny_function in module __main__: funny_function(x, y, z=3) Computes x*y + 2*z
Python 3.4:
Für Python 3.4 und höher bietet functools.wraps eine ähnliche Lösung:
<code class="python">import functools def args_as_ints(func): @functools.wraps(func) def wrapper(*args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return func(*args, **kwargs) return wrapper</code>
Durch den Einsatz dieser Techniken können Dekorateure die Funktionsfunktionalität verbessern und gleichzeitig ihre Originalsignaturen beibehalten, wodurch Klarheit und Konsistenz in der Codebasis gewährleistet werden.
Das obige ist der detaillierte Inhalt vonWie bleiben Funktionssignaturen bei der Verwendung von Dekoratoren in Python erhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!