python - 函数签名问题
ringa_lee
ringa_lee 2017-04-17 17:52:40
0
3
962
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,为什么?

ringa_lee
ringa_lee

ringa_lee

répondre à tous(3)
黄舟

é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
洪涛

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

Peter_Zhu
>>> def decorator(f):
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        return f(*args, **kwargs)
    return wrapper

>>> @decorator
def func(param1): pass

>>> func.__name__
'func'
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal