Maison > Questions et réponses > le corps du texte
def now():
print('2016-06-03')
def log(text):
def decorator(func):
def wrapper(*args, **kw):
print('%s %s():' % (text, func.__name__))
return func(*args, **kw)
return wrapper
return decorator
@log('rain:')
def now():
print('2016-06-03')
now()
像上面那样,装饰后的函数的 __name__
已经从 now
变成了 wrapper
,为什么?
黄舟2017-04-17 17:54:40
équivaut à now
devenir log('rain:')(原来的now)
Ensuite, expliquez pourquoi __name__ est un wrapper
D'après https://docs.python.org/2.7/library/inspect.html
__name__
: nom avec lequel cette fonction a été définie
Donc __name__
est basé sur la définition spécifique
Comme un autre exemple
>>> def func():
... pass
...
>>> new_func = func
>>> print func.__name__
func
>>> print new_func.__name__
func
PHP中文网2017-04-17 17:54:40
La fonction décorée n'est en fait pas la fonction now
Mais log("rain")(now)
En fait, c'est le wrapper que vous avez défini.
Pour ce problème, il existe des wraps dans functools qui peuvent définir correctement __name__ et autres
天蓬老师2017-04-17 17:54:40
>>> def decorator(f):
@functools.wraps(f)
def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
>>> @decorator
def func(param1): pass
>>> func.__name__
'func'