Das Problem tritt auf, wenn eine Funktion mit einem generischen Dekorator dekoriert wird, der die Argumente der Funktion ändert, z. B. Typkonvertierung, Protokollierung oder Memoisierung. Die dekorierte Funktion kann die Dokumentation und Signatur der Originalfunktion nicht erben, was es schwierig macht, ihr Verhalten zu verstehen.
Um dieses Problem zu beheben, wurden mehrere Problemumgehungen vorgeschlagen:
Installieren Sie das Modul „Decorator“ mit pip und ändern Sie die Decorator-Definition so, dass sie die Annotation „decorator.decorator“ enthält. Dadurch wird sichergestellt, dass der Dekorator generisch bleibt und gleichzeitig die Signatur der Funktion erhalten bleibt:
<code class="python">import decorator @decorator.decorator def args_as_ints(f, *args, **kwargs): # Perform argument conversion return f(*args, **kwargs)</code>
Für Python 3.4 und höher: 'functools.wraps( )‘ bietet eine alternative Lösung, die sowohl die Signatur als auch die Dokumentation der Funktion automatisch beibehält:
<code class="python">import functools def args_as_ints(func): @functools.wraps(func) def wrapper(*args, **kwargs): # Perform argument conversion return func(*args, **kwargs) return wrapper</code>
Beide Methoden bewahren effektiv die Signatur und Dokumentation der ursprünglichen Funktion. Das Modul „decorator“ ist für Python 2 und 3 geeignet, während „functools.wraps()“ nur in Python 3.4 und höher verfügbar ist.
Das obige ist der detaillierte Inhalt vonSo bewahren Sie Signaturen dekorierter Funktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!