[PYTHON] So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält

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

So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
So erstellen Sie einen Raspberry Pi, der die Tweets eines bestimmten Benutzers spricht
Erstellen Sie eine Funktion zur Visualisierung / Auswertung des Clustering-Ergebnisses
So lösen Sie die rekursive Funktion, die abc115-D gelöst hat
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Wie man das Dokument der magischen Funktion (Linienmagie) trifft
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Teil 1 Polynomregression
So erstellen Sie eine Eigenschaft von Beziehungen, die durch bestimmte Bedingungen vorab abgerufen werden kann
[Ubuntu] So löschen Sie den gesamten Inhalt des Verzeichnisses
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
So führen Sie die Exportfunktion des GCP-Datenspeichers automatisch aus
So ermitteln Sie den Skalierungskoeffizienten eines bipolaren Wavelets
So verbinden Sie den Inhalt der Liste mit einer Zeichenfolge
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Verwendung der Zip-Funktion
So erstellen Sie ein Conda-Paket
So erstellen Sie eine rekursive Funktion
So erstellen Sie eine virtuelle Brücke
Wie erstelle ich eine Docker-Datei?
So erstellen Sie eine Konfigurationsdatei
Übersicht über das Erstellen eines Server-Sockets und das Einrichten eines Client-Sockets
So bestimmen Sie die Existenz eines Selenelements in Python
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
So überprüfen Sie die Speichergröße eines Wörterbuchs in Python
Eine Funktion, die die Verarbeitungszeit einer Methode in Python misst
So ermitteln Sie die Speicheradresse des Pandas-Datenrahmenwerts
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Wie erstelle ich eine große Menge an Testdaten in MySQL? ??
[Python] Ein Hinweis, dass ich das Verhalten von matplotlib.pyplot zu verstehen begann
[NNabla] So entfernen Sie die mittlere Ebene eines vorgefertigten Netzwerks
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
[Python] Ein Programm, das den Inhalt der Liste nach links dreht
So erstellen Sie einen Klon aus Github
So erstellen Sie einen Git-Klonordner
So überprüfen Sie die Version von Django
So erstellen Sie ein Repository aus Medien
Teilen und Verarbeiten eines Datenrahmens mithilfe der Groupby-Funktion
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
[Python] Ein Programm, das die Anzahl der gepaarten Socken berechnet
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Ein Memorandum darüber, wie man Pandas schreibt, das ich persönlich oft vergesse
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
So setzen Sie eine Zeilennummer am Anfang einer CSV-Datei
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
[Entwicklungsumgebung] So erstellen Sie einen Datensatz in der Nähe der Produktionsdatenbank
So spielen Sie ein Video ab, während Sie die Anzahl der Bilder ansehen (Mac)
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
[Python] Hinweis: Selbst erstellte Funktion zum Ermitteln des Bereichs der Normalverteilung
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet
So übergeben Sie das Ergebnis der Ausführung eines Shell-Befehls in einer Liste in Python
So finden Sie den Bereich des Boronoi-Diagramms
Wie man eine Benutzergruppe mit Slack-Benachrichtigung erwähnt, wie man die ID einer Benutzergruppe überprüft
Die Geschichte der IPv6-Adresse, die ich auf ein Minimum beschränken möchte