Si vous définissez et utilisez votre propre décorateur en Python, vous souhaiterez peut-être pouvoir transmettre des arguments au décorateur plus tard.
Emplacement d'utilisation d'origine du décorateur
@my_decorator
def hoge():
# ...
Si vous implémentez un décorateur général, si vous voulez pouvoir passer des arguments au décorateur plus tard, Il faudra réécrire tous les décorateurs qui ont été utilisés comme ↑ comme ↓.
Lors de la définition d'arguments lors de l'utilisation d'un décorateur
@my_decorator(arg1='value1')
def hoge():
# ...
Même si vous n'avez besoin d'aucun argument, vous devez mettre des parenthèses si l'implémentation du décorateur change.
Lorsqu'aucun argument n'est défini lors de l'utilisation du décorateur
@my_decorator()
def hoge():
# ...
La réécriture de toutes les parties qui utilisent le décorateur est difficile à modifier et à vérifier, j'ai donc voulu le faire fonctionner sans parenthèses si aucun argument n'est nécessaire.
Je veux créer un décorateur (my_decorator
) qui peut utiliser dynamiquement des arguments comme indiqué ci-dessous.
En passant, je voudrais l'implémenter en tant que décorateur pour les décorateurs afin que ces fonctions puissent être utilisées universellement.
python
#Sans arguments
@my_decorator
def hoge():
pass
#Avec argument
@my_decorator(arg1='value1')
def fuga():
pass
Implémentez un décorateur qui interprète dynamiquement les arguments à appliquer au décorateur, comme indiqué ci-dessous.
decorators.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import functools
def dynamic_args(func0):
def wrapper(*args, **kwargs):
if len(args) != 0 and callable(args[0]):
#Lorsqu'une fonction est passée comme premier argument:Traitez comme un décorateur sans arguments
func = args[0]
return functools.wraps(func)(func0(func))
else:
#Autre:Traiter comme un décorateur avec des arguments
def _wrapper(func):
return functools.wraps(func)(func0(func, *args, **kwargs))
return _wrapper
return wrapper
Si vous préparez un décorateur comme celui ci-dessus, vous pouvez atteindre votre objectif simplement en définissant votre propre décorateur comme suit.
python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from decorators import dynamic_args
#Appliquez le décorateur créé ci-dessus à votre propre décorateur
@dynamic_args
def my_decorator(func, arg1='default_value1', arg2='default_value2'):
def wrapper(*args, **kwargs):
#Arguments définis(arg1, arg2)Écrivez le processus que vous voulez réellement faire en utilisant
# ...
return wrapper
Comme exemple, créez un décorateur avec des parenthèses avant et après la valeur de retour (chaîne de caractères) avec le nom mon_décorateur
.
sample.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from decorators import dynamic_args
#####################
#Définition propre du décorateur#
#####################
@dynamic_args
def my_decorator(func, before='「', after='」'):
def wrapper(*args, **kwargs):
return "{} {} {}".format(before, func(*args, **kwargs), after)
return wrapper
##########################
#Exemple d'utilisation du décorateur sans argument#
##########################
@my_decorator
def func_without_args():
return "Décorateur sans argument"
print(func_without_args()) # output:"Décorateur sans arguments"
##########################
#Exemple d'utilisation d'un décorateur avec des arguments#
##########################
@my_decorator(before='『', after='』')
def func_with_args():
return "Décorateur avec arguments"
print(func_with_args()) # output:"Décorateur avec arguments"
####################################
#Exemple d'application d'un décorateur à une fonction prédéfinie#
####################################
def func_without_decorator():
return "Pas de décorateur"
print(my_decorator(func_without_decorator)()) # output:"Pas de décorateur"
print(my_decorator(before="『", after="』")(func_without_decorator)()) # output:"Pas de décorateur"
Astuces Python: Je veux passer des arguments au décorateur - Life with Python http://www.lifewithpython.com/2016/09/python-decorator-with-arguments.html
Expression de décorateur Python (2) -Quand un décorateur a un argument et que vous appliquez plusieurs décorateurs | Oubliez immédiatement le cerveau Une note pour cela http://jutememo.blogspot.jp/2008/10/python-2.html
python - AttributeError: 'str' object has no attribute 'module' - Stack Overflow http://stackoverflow.com/questions/18493879/attributeerror-str-object-has-no-attribute-module
Recommended Posts