„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie erhalten Sie Funktionssignaturen bei der Verwendung von Dekoratoren in Python?

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

Gepostet am 2025-03-24
Durchsuche:110

How to Preserve Function Signatures When Using Decorators in Python?

Erhalt von Unterschriften dekorierter Funktionen

Dekoratoren sind ein mächtiges Werkzeug zur Verbesserung der Funktionalität von Python -Funktionen. Sie können jedoch manchmal die Signatur der ursprünglichen Funktion verdecken. Dies kann für Dokumentation, Debugging und automatisierte Tools problematisch sein.

Problem:

betrachten einen generischen Dekorateur, der alle Argumente in Abgänge umgeht:

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
definiten_as_ints (f): def g (*args, ** kwargs): args = [int (x) für x in args] kwargs = dict ((k, int (v)) für k, v in kwargs.items ()) Rückgabe f (*args, ** kwargs) return g

Während die Dekoration wie erwartet funktioniert, wird die Unterschrift der dekorierten Funktion durch " args,

*kwargs" ersetzt, in dem Informationen über die ursprünglichen Argumente verlieren. Befriedigend:

kopieren Sie die Unterschrift manuell in den Dokument.

Erstellen eines neuen Dekorators für jede bestimmte Unterschrift.

    manuell die dekorierte Funktion mit dem Execing. Elegante Lösung:
  • importieren Dekorateur @Decorator.Decorator def args_as_ints (f, *args, ** kwargs): args = [int (x) für x in args] kwargs = dict ((k, int (v)) für k, v in kwargs.items ()) return f (*args, ** kwargs)
  • Dieser Dekorateur bewahrt die Unterschrift der Originalfunktion, indem sie sie als Argumente an die verpackte Funktion übergeben. Def Funny_function (x, y, z = 3): "" "Berechnet x*y 2*z" "" " Rückgabe x*y 2*z
Jetzt behält die dekorierte Funktion Funny_function ihre ursprüngliche Signatur:

>>> help (Funny_function) Hilfe bei der Funktion Funny_function im Modul __main__: Funny_function (x, y, z = 3) Berechnet x*y 2*z

python 3.4:

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)

functools importieren Def args_as_ints (func): @functools.wraps (func) Def -Wraper (*args, ** kwargs): args = [int (x) für x in args] kwargs = dict ((k, int (v)) für k, v in kwargs.items ()) Rückgabefunktion (*args, ** kwargs) Return Wrapper

Durch die Verwendung dieser Techniken können Dekorateure die Funktionsfunktionalität verbessern und gleichzeitig ihre ursprünglichen Unterschriften bewahren und Klarheit und Konsistenz in der Codebasis sicherstellen.

Freigabeerklärung Dieser Artikel wird reproduziert unter: 1729155261 Wenn ein Verstoß vorliegt, wenden Sie sich bitte an [email protected], um ihn zu löschen.
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3