Python-Funktionsdekorateur

Ich beschloss, es in Qiita als Zusammenfassung der Forschungs- und Lehrmaterialien zur Überprüfung zu belassen. Ich denke, dass es viele unfreundliche Beschreibungen gibt, weil es für meine eigene Organisation ist. In diesem Fall verwenden Sie es bitte als Sammlung von Links zur Referenz-URL-Liste.

Ursprung

Ursprünglich enthält das Entwurfsmuster ein Dekorationsmuster, und es scheint, dass der Python-Dekorator auch davon stammt.

Dekorationsmuster

Fügen Sie vorhandenen Objekten dynamisch neue Funktionen und Verhaltensweisen hinzu

Quelle: Dekorationsmuster https://ja.wikipedia.org/wiki/Decorator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Wir werden mit dem Verständnis fortfahren, das auf dieser Definition basiert. Grob gesagt können Sie der Verarbeitung, die Sie ausführen möchten, Vor- und Nachbearbeitung hinzufügen oder die Antwort selbst ersetzen.

Genau genommen sind das Decorator-Muster und der Decorator unterschiedlich, oder das letztere scheint das erstere Element zu sein, aber ich gehe dort nicht tiefer. Referenz: Python-3-Muster, Redewendungen und Test https://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html

Erstes Objekt

In Python sind Funktionen erste Objekte. Python-Funktionen sind Objekte, und Sie können sie für Funktionsargumente und Rückgabewerte verwenden. Der Dekorateur kann die als Argument empfangene Funktion als Teil der eigenen Verarbeitung des Dekorateurs ausführen.

Funktionsprüfung

Ich habe mit folgenden Dingen gespielt.

decorater.py


#Definieren Sie einen Dekorateur
def decorator(func):
    #Der Name muss nicht deco sein. Es kann deded werden.
    def _deco(*args, **kwargs):
        #Der Name der Funktion kann beliebig sein. Sie können auch decodeco verwenden.
        print('japan')
        func()
        print('america')
    return _decorator

# @Befestigen Sie den Dekorateur und die Funktion
#Wenn der Dekorateur dedede ist@Dedede
@decorator
def hello_world():
    print('china')
# japan
# china
# america

@decorator
def hello_earth():
    print('england')
# japan
# england
# america

@decorator
def hello_tokyo():
    print('tokyo')
# japan
# tokyo
# america

Jede Funktion wird als Argument an die Decorator-Funktion übergeben und im Decorator ausgeführt. Die mit @decorator vorangestellte Funktion wird zum Argument des Dekorateurs als func. Der Name des Dekorateurs kann alles sein. Geben Sie ihm einen passenden Namen für Ihren Zweck. Im obigen Beispiel konnten wir den Druckvorgang zwischen Japan und Amerika einfügen.

Implementierungsbeispiel

Da wir den Vorgang bestätigen konnten, ist er implementiert. Implementierung einer gemeinsamen API in API Gateway + Lambda. Tatsächlich wird es von jemand anderem als mir entworfen und implementiert, daher werde ich einige der Elemente kurz beschreiben. Für die Lambda-Verarbeitung werden die Vorverarbeitung und die Protokollverarbeitung der Anforderungsparameter durchgeführt.

implementation.py


    def implementation(func):
        def _deco(*args, **kwargs):
            # *args können Lambda-Ereignisse empfangen.*args ist ein Argument variabler Länge.

            print("lambda start")
            print(args[0])
            #Es ist einfach zu verwenden, wenn Sie die Verarbeitung für das Protokoll separat erstellen und aufrufen. Da es hier nur vorübergehend ist, drucken Sie()

            params = json.loads(event.get("body"))
            if event.get('pathParameters'):
                params.update(event.get('pathParameters'))
            # get,post Kombiniere jeden Prozess zu einem Parameter.

            if not params.get("id"):
                return error_response()
            #Wenn der Parameter keine ID hat, kann eine Verarbeitung wie das Zurückgeben eines Fehlers durchgeführt werden.

            response = func(params, id)
            #Holen Sie sich das Ausführungsergebnis der einzelnen Verarbeitung
            print("lamdba end")
            return response
            #Wenn Sie am unteren Rand des Nestes einen Rückgabewert festlegen, wird dieser durch den neuen Rückgabewert ersetzt.
            #Sie können das Protokoll ausspucken, bevor Sie die Antwort des ursprünglichen Prozesses zurückgeben.
        return _deco

lambda_function.py


@implementation
def handler(params, id):
    """
Einige Verarbeitung
    """
   return success_response()

Wenn Sie den ursprünglichen Prozess ausführen, können Sie Funktionen hinzufügen, z. B. das Protokoll als allgemeinen Prozess vorbereiten, die Parameter organisieren, die Elemente überprüfen und die Antwort durch die Antwort zum Zeitpunkt des Fehlers ersetzen.

Dekorateur mit Argumenten für die individuelle Verarbeitung

Wenn Sie beispielsweise eine Validierung durchführen, ändert sich der erforderliche Wert abhängig von der einzelnen Verarbeitung. Verwenden Sie daher einen Dekorator mit einem Argument, um das im einzelnen Prozess definierte Validierungsschema an das Argument übergeben zu können.

implementation_with_params


def implementation_with_params(schema):
    def _deco(func):
        def _decodeco(*args, **kwargs):
            params = *args[0].get("body")
            error = validator(schema, params)
            #Übergeben Sie einen Validator an die definierte Funktion.
            if error:
                return error_response()
            response = func(params)
            return response
        return _decodeco
    return _deco

lambda_function.py


#Liste der Schlüssel zur Validierung
SCHEMA = ["id","user_name", "password", "address", "tel"]

@implementation_with_params(schema=SCHEMA)
def handler(params)
    """
Einige Verarbeitung
    """
    return success_response()

Tatsächlich validieren wir mit Cerberous.

Andere Verwendungen

Die Änderung des Antwortinhalts, die Vorverarbeitung der Anforderungsparameter und die Protokollverarbeitung sowie die Validierungsverarbeitung werden ebenfalls beschrieben, es sind jedoch auch andere Verwendungen möglich.

Referenz-URL

Offizielle Dokumentation https://docs.python.org/ja/3/reference/compound_stmts.html#function Über Python-Dekorateure https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e 12 Schritte zum Verständnis von Python-Dekorateuren https://qiita.com/rdtr/items/d3bc1a8d4b7eb375c368 Wiedereinführung in Python-Dekoratoren ~ Lernen wir Dekoratoren nach Typ ~ https://qiita.com/macinjoke/items/1be6cf0f1f238b5ba01b Wie man einen Dekorateur mit Argumenten macht https://qiita.com/utgwkk/items/d7c6af97b81df9483f9e Python-Decorators und ihre Verwendungsmuster neu entdecken https://slideship.com/users/@rhoboro/presentations/2017/12/YagWLokYuWX5Er78UdLbWX/?p=23 Dekorationsmuster https://ja.wikipedia.org/wiki/Decorator%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 Entwurfsmuster #Decorator https://qiita.com/nirperm/items/398cb970826fa972a94f python-3 patterns,idioms and test https://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html Entwurfsmuster in Python ~ Py Design ~ Dekorationsmuster https://pydp.info/GoF_dp/structure/09_Decorator/

Beiseite

Javascript und Typescript haben auch Dekorateure.

Verwendung von JavaScript-Dekoratoren https://qiita.com/kerupani129/items/2b3f2cba195c0705b2e5 Über TypeScript Decorator - Offizielles Dokument Japanische Übersetzung https://mae.chab.in/archives/59845 Schreiben Sie sauberes und einfach zu lesendes JavaScript. Machen Sie sich mit den Grundlagen der Dekorateure vertraut. Https://www.webprofessional.jp/javascript-decorators-what-they-are/

Recommended Posts

Python-Funktionsdekorateur
Python-Funktion ①
[Python] -Funktion
Python-Funktion ②
Beispiel für Funktionen höherer Ordnung (Dekoratoren) in Python
Hinweis: Python-Dekorator
Python-Aufzählungsfunktion
Python> Funktion> Schließen
[Python] Generatorfunktion
Python> Funktion> Innere Funktion
Erstellen Sie mit Class einen Python-Funktionsdekorator
Über Funktionsargumente (Python)
Funktionsausführungszeit (Python)
Zusammenfassung der Python-Funktionsargumente
Python-Druckfunktion (Fortsetzung)
Python: Über Funktionsargumente
Python-Dekorator-Operationsnotiz
Ich habe Python> Decorator ausprobiert
Erstellen Sie eine Funktion in Python
Dekorateur 1
Python
Verwenden Sie die Rückruffunktion in Python
[Python] Wert des Funktionsobjekts (?)
ntile (Dezil) -Funktion in Python
[Python] Der Ursprung des Namens der Python-Funktion
Python-Anfänger-Memorandum-Funktion
Über die Aufzählungsfunktion (Python)
Python-URL-Einstellung enthalten Funktion
Python #Funktion 2 für Super-Anfänger
Dekorateur 2
Zeichne die Yin-Funktion in Python
Sofortige Funktion (Lüge) in Python
Dekorateur
Dekorateur
Dekorateur 1
Dekorateur 2
Dekorateur
Dekorateur
Hinweis: Python-Dekorator
Dekorateur zu versuchen
Python-Funktionsdekorateur
[Python] Was ist eine Zip-Funktion?
[Python] Rückruffunktion (Funktion als Argument übergeben)
Implementieren Sie die Funktion power.prop.test von R in Python
Definition des Funktionsargumenttyps in Python
Inklusive Notation im Argument der Python-Funktion
[Einführung in die Udemy Python3 + -Anwendung] 57. Decorator
Schreiben Sie die AWS Lambda-Funktion in Python
[Python] Was ist @? (Über Dekorateure)
Messen Sie die Ausführungszeit von Funktionen in Python
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Python #len Funktion für Super-Anfänger
Funktionssynthese und Anwendung in Python
Erstellen Sie ein universelles Dekorationsframework für Python
Verwendung der Zip-Funktion von Python
[Python] Unterschied zwischen Funktion und Methode
[Python] Funktionsargumente * (Stern) und ** (Doppelstern)
[OpenCV; Python] Zusammenfassung der Funktion findcontours
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Kafka Python
Python3> Funktionen> Funktionsumbenennungsmechanismus> f = fib
Python-Grundlagen ⑤
Python-Zusammenfassung