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

DDD
Freigeben: 2024-10-17 16:59:58
Original
340 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!