Heim  >  Artikel  >  Backend-Entwicklung  >  Wie bewahrt man die Signatur dekorierter Funktionen in Python?

Wie bewahrt man die Signatur dekorierter Funktionen in Python?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-17 17:02:02574Durchsuche

How to Preserve the Signature of Decorated Functions in Python?

Signaturen dekorierter Funktionen beibehalten

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:

  • Einschließen der Signatur in den Dokumentstring der dekorierten Funktion.
  • Erstellen spezialisierter Dekorateure für jede spezifische Signatur.

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!

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