Heim >Backend-Entwicklung >Python-Tutorial >Wie bewahrt man die Signatur dekorierter Funktionen in Python?
Dekoratoren sind leistungsstarke Werkzeuge in Python zur Erweiterung des Verhaltens vorhandener Funktionen. Bei der Anwendung auf eine Funktion verliert die resultierende dekorierte Funktion jedoch häufig ihre ursprüngliche Dokumentation und Signatur. Dies kann problematisch sein, insbesondere wenn generische Dekoratoren verwendet werden, die häufige Aufgaben wie Protokollierung oder Argumentkonvertierung ausführen.
Häufige Problemumgehungen
Einige häufige Problemumgehungen sind:
Verwenden des Dekoratormoduls
Eine robustere Lösung ist die Verwendung des Decorator-Moduls, das eine Decorator-Funktion namens @decorator.decorator bereitstellt. Indem Sie diesen Dekorator auf Ihre eigene Dekoratorfunktion anwenden, können Sie die Signatur der ursprünglichen Funktion beibehalten.
<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) @args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z print(funny_function("3", 4.0, z="5")) # 22 help(funny_function) # Help on function funny_function in module __main__: # # funny_function(x, y, z=3) # Computes x*y + 2*z</code>
Python 3.4
In Python 3.4 und höher ist die Die Funktion functools.wraps() kann zum Beibehalten von Signaturen verwendet werden.
<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 @args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z print(funny_function("3", 4.0, z="5")) # 22 help(funny_function) # Help on function funny_function in module __main__: # # funny_function(x, y, z=3) # Computes x*y + 2*z</code>
Das obige ist der detaillierte Inhalt vonWie bewahrt man die Signatur dekorierter Funktionen in Python?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!