Insbesondere in Funktionsdekoratoren erstellen und geben Sie häufig eine Funktion zurück, die die Änderungsfunktion, die Sie als Argument erhalten, umschließt. Manchmal möchten Sie jedoch, dass die Signatur der Umhüllungsfunktion mit der umschlossenen Funktion übereinstimmt. In Python 3.4 und höher ist diese Implementierung mit einem Dekorator namens Wraps möglich, der von den Standardbibliotheksfunktionen bereitgestellt wird.
Im folgenden Beispiel hat die mit dem Dekorator "args_as_ints" modifizierte "lustige_Funktion" (dh der mit "functools.wraps" modifizierte "Wrapper") dieselbe Signatur wie die modifizierte Funktion "lustige_Funktion", aber alle Konvertieren Sie das Argument in "int" und führen Sie dieselbe Berechnung für die ursprüngliche Funktion durch.
python
# Source: https://stackoverflow.com/questions/147816/preserving-signatures-of-decorated-functions
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
Nach der Qualifizierung hat die "lustige_Funktion" ein Mitglied namens "wrapped", das die ursprüngliche Funktion beibehält.
Verwenden Sie die Standardbibliotheksprüfung, um die Signatur einer Funktion zu überprüfen. Sie können die von inspect bereitgestellte Funktion "Signatur" verwenden, um die Signatur der Funktion als "Signatur" -Objekt abzurufen. Der folgende Code stellt sicher, dass die Signatur "lustige_Funktion" vor und nach der Änderung identisch ist.
python
>>> from inspect import signature
>>> str(signature(funny_function))
'(x, y, z=3)'
>>> signature(funny_function) == signature(funny_function.__wrapped__)
True
Recommended Posts