Décorateur de fonction Python

J'ai décidé de le laisser dans Qiita comme un résumé de la recherche et du matériel pédagogique pour examen. Je pense qu'il existe de nombreuses descriptions peu amicales parce que c'est pour ma propre organisation. Dans ce cas, veuillez l'utiliser comme une collection de liens vers la liste d'URL de référence.

Origine

À l'origine, il y a un motif de décorateur dans le motif de conception, et il semble que le décorateur Python en vienne également.

Motif décorateur

Ajouter dynamiquement de nouvelles fonctionnalités et comportements aux objets existants

Source: modèle de décorateur https://ja.wikipedia.org/wiki/Decorator_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3

Nous procéderons avec compréhension basée sur cette définition. En gros, vous pouvez ajouter un prétraitement et un post-traitement au traitement que vous souhaitez exécuter ou remplacer la réponse elle-même.

À proprement parler, le motif Decorator et Decorator sont différents, ou ce dernier semble être l'élément premier, mais je ne creuse pas plus profondément là-bas. Référence: modèles, expressions idiomatiques et test python-3 https://python-3-patterns-idioms-test.readthedocs.io/en/latest/PythonDecorators.html

Premier objet

En Python, les fonctions sont les premiers objets. Les fonctions Python sont des objets et vous pouvez les utiliser pour les arguments de fonction et les valeurs de retour. Le décorateur peut exécuter la fonction reçue comme argument dans le cadre du propre traitement du décorateur.

Contrôle de fonctionnement

Je jouais avec les choses suivantes.

decorater.py


#Définir un décorateur
def decorator(func):
    #Le nom n'a pas à être déco. Cela peut être déduit.
    def _deco(*args, **kwargs):
        #Le nom de la fonction peut être n'importe quoi. Vous pouvez également utiliser decodeco.
        print('japan')
        func()
        print('america')
    return _decorator

# @Fixez le décorateur et la fonction
#Si le décorateur est dédaigné@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

Chaque fonction est passée comme argument à la fonction décoratrice et est exécutée à l'intérieur du décorateur. La fonction préfixée par @decorator devient l'argument du décorateur en tant que func. Le nom du décorateur peut être n'importe quoi. Donnez-lui un nom approprié à votre objectif. Dans l'exemple ci-dessus, nous avons pu insérer le processus d'impression entre le Japon et l'Amérique.

Exemple d'implémentation

Puisque nous avons pu confirmer l'opération, elle est mise en œuvre. Implémentation d'une API commune dans API Gateway + Lambda. En fait, il est conçu et mis en œuvre par quelqu'un d'autre que moi, je vais donc décrire brièvement certains des éléments. Pour le traitement lambda, le prétraitement et le traitement du journal des paramètres de demande sont effectués.

implementation.py


    def implementation(func):
        def _deco(*args, **kwargs):
            # *args peut recevoir des événements lambda.*args est un argument de longueur variable.

            print("lambda start")
            print(args[0])
            #Il est facile à utiliser si vous créez et appelez le traitement du journal séparément. Puisqu'il est temporaire ici, imprimez()

            params = json.loads(event.get("body"))
            if event.get('pathParameters'):
                params.update(event.get('pathParameters'))
            # get,post Combinez chaque processus en un seul paramètre.

            if not params.get("id"):
                return error_response()
            #Si le paramètre n'a pas d'ID, un traitement tel que le renvoi d'une erreur peut être effectué.

            response = func(params, id)
            #Obtenez le résultat de l'exécution du traitement individuel
            print("lamdba end")
            return response
            #Si vous définissez une valeur de retour au bas de l'imbrication, elle sera remplacée par la nouvelle valeur de retour.
            #Vous pouvez cracher le journal avant de renvoyer la réponse du processus d'origine.
        return _deco

lambda_function.py


@implementation
def handler(params, id):
    """
Certains traitements
    """
   return success_response()

Lors de l'exécution du processus d'origine, vous pouvez ajouter des fonctions telles que la préparation du journal en tant que processus commun, l'organisation des paramètres, la vérification des éléments et le remplacement de la réponse par celle au moment de l'erreur.

Décorateur avec des arguments à associer au traitement individuel

Par exemple, lors de la validation, la valeur requise change en fonction du traitement individuel. Par conséquent, afin de pouvoir transmettre le schéma de validation défini dans le processus individuel à l'argument, utilisez un décorateur avec un argument.

implementation_with_params


def implementation_with_params(schema):
    def _deco(func):
        def _decodeco(*args, **kwargs):
            params = *args[0].get("body")
            error = validator(schema, params)
            #Passez un validateur à la fonction définie.
            if error:
                return error_response()
            response = func(params)
            return response
        return _decodeco
    return _deco

lambda_function.py


#Liste des clés de validation
SCHEMA = ["id","user_name", "password", "address", "tel"]

@implementation_with_params(schema=SCHEMA)
def handler(params)
    """
Certains traitements
    """
    return success_response()

En fait, nous validons avec Cerberous.

Autres utilisations

La modification du contenu de la réponse, le prétraitement des paramètres de demande et le traitement des journaux, et le traitement de validation sont également décrits, mais d'autres utilisations sont également possibles. -Enregistrer le début et la fin du traitement et mesurer les performances ・ Processus d'authentification ・ Gestion de session

URL de référence

Documentation officielle https://docs.python.org/ja/3/reference/compound_stmts.html#function À propos des décorateurs Python https://qiita.com/mtb_beta/items/d257519b018b8cd0cc2e 12 étapes pour comprendre les décorateurs Python https://qiita.com/rdtr/items/d3bc1a8d4b7eb375c368 Réintroduction aux décorateurs Python ~ Apprenons les décorateurs par type ~ https://qiita.com/macinjoke/items/1be6cf0f1f238b5ba01b Comment faire un décorateur avec des arguments https://qiita.com/utgwkk/items/d7c6af97b81df9483f9e Redécouvrir les décorateurs Python et leurs modes d'utilisation https://slideship.com/users/@rhoboro/presentations/2017/12/YagWLokYuWX5Er78UdLbWX/?p=23 Motif décorateur https://ja.wikipedia.org/wiki/Decorator%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3 Modèle de conception #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 Modèle de conception en Python ~ Conception Py ~ Modèle de décoration https://pydp.info/GoF_dp/structure/09_Decorator/

De côté

Javascript et Typescript ont également des décorateurs.

Comment utiliser les décorateurs JavaScript https://qiita.com/kerupani129/items/2b3f2cba195c0705b2e5 À propos de TypeScript Decorator - Document officiel Traduction japonaise https://mae.chab.in/archives/59845 Écrivez du JavaScript propre et facile à lire. Prenez une longueur d'avance sur les bases des décorateurs https://www.webprofessional.jp/javascript-decorators-what-they-are/

Recommended Posts

Décorateur de fonction Python
fonction python ①
[Python] fonction
fonction python ②
Exemple de fonctions d'ordre supérieur (décorateurs) en Python
Remarque: décorateur Python
fonction d'énumération python
Python> fonction> Fermeture
[Python] Fonction de générateur
Python> fonction> Fonction interne
Créer un décorateur de fonction Python avec Class
À propos des arguments de fonction (python)
Temps d'exécution de la fonction (Python)
Résumé des arguments de la fonction Python
Fonction d'impression Python (suite)
Python: à propos des arguments de fonction
Mémo d'opération de décorateur Python
J'ai essayé Python> décorateur
Créer une fonction en Python
Décorateur 1
Python
Utiliser la fonction de rappel en Python
[python] Valeur de l'objet fonction (?)
Fonction ntile (décile) en python
[Python] L'origine du nom de la fonction python
fonction de mémorandum python pour débutant
À propos de la fonction enumerate (python)
le paramètre d'URL de python inclut la fonction
Python #function 2 pour les super débutants
Décorateur 2
Dessiner la fonction Yin en python
Fonction immédiate (lie) en python
Décorateur
Décorateur
Décorateur 1
Décorateur 2
Décorateur
Décorateur
Remarque: décorateur Python
Le décorateur doit réessayer
Décorateur de fonction Python
[Python] Qu'est-ce qu'une fonction zip?
[python] Fonction de rappel (passez la fonction en argument)
Implémenter la fonction power.prop.test de R en python
Définition du type d'argument de fonction en python
Notation inclusive dans l'argument de la fonction Python
[Présentation de l'application Udemy Python3 +] 57. Décorateur
Ecrire une fonction AWS Lambda en Python
[Python] Qu'est-ce que @? (À propos des décorateurs)
Mesurer le temps d'exécution de la fonction en Python
[Python] Faire de la fonction une fonction lambda
Fonction Python #len pour les super débutants
Synthèse de fonctions et application en Python
Créer un framework de décorateur à usage général pour Python
Comment utiliser la fonction zip de python
[Python] Différence entre fonction et méthode
[Python] Arguments de fonction * (étoile) et ** (étoile double)
[OpenCV; Python] Résumé de la fonction findcontours
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
python kafka
Python3> Fonctions> Mécanisme de changement de nom de fonction> f = fib
Les bases de Python ⑤
Résumé Python