ホームページ  >  に質問  >  本文

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日前893

全員に返信(3)返信します

  • 黄舟

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

    は、nowlog('rain:')(原来的now)

    になることと同等です。

    次に、__name__ がラッパーである理由を説明してください

    https://docs.python.org/2.7/library/inspect.htmlによると

    __name__: この関数が定義された名前

    つまり、__name__ は特定の定義

    に基づいています。

    別の例として

    リーリー

    返事
    0
  • PHP中文网

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

    装飾された関数は実際には now 関数ではありません

    代わりに、log("rain")(now)
    は実際にはあなたが定義したラッパーです。

    この問題に対して、__name__ などを正しく設定できる関数ツールのラップがあります

    返事
    0
  • 天蓬老师

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

    リーリー

    返事
    0
  • キャンセル返事