Heim >Backend-Entwicklung >Python-Tutorial >Wie bleiben Funktionssignaturen bei der Verwendung von Dekoratoren in Python erhalten?

Wie bleiben Funktionssignaturen bei der Verwendung von Dekoratoren in Python erhalten?

DDD
DDDOriginal
2024-10-17 16:59:58471Durchsuche

How to Preserve Function Signatures When Using Decorators in Python?

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:

  • Manuelles Kopieren der Signatur in den Dokumentstring.
  • Erstellen eines neuen Dekorators für jede spezifische Signatur.
  • Manuelles Erstellen der dekorierten Funktion mit exec.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn