首頁  >  問答  >  主體

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_lee2742 天前892

全部回覆(3)我來回復

  • 黄舟

    黄舟2017-04-17 17:54:40

    等價於 now 变为 log('rain:')(原来的now)

    接著解釋下為啥__name__是wrapper

    根據https://docs.python.org/2.7/library/inspect.html

    __name__: name with which this function was defined

    所以__name__是根據具體定義時候的來

    如另外一個例子

    >>> def func():
    ...     pass
    ... 
    >>> new_func = func
    >>> print func.__name__
    func
    >>> print new_func.__name__
    func

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-17 17:54:40

    裝飾之後的函數其實不是now函數了

    而是log(「rain」)(now)
    其實就是你定義的wrapper。

    對於這個問題、functools裡有個wraps可以把__name__之類的正確設定

    回覆
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:54:40

    雷雷

    回覆
    0
  • 取消回覆