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.
À 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.
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
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.
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.
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.
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.
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
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/
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