recherche

Maison  >  Questions et réponses  >  le corps du texte

python - 函数签名问题

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_leeringa_lee2876 Il y a quelques jours998

répondre à tous(3)je répondrai

  • 黄舟

    黄舟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

    répondre
    0
  • PHP中文网

    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

    répondre
    0
  • 天蓬老师

    天蓬老师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'

    répondre
    0
  • Annulerrépondre