python - 函数签名问题
ringa_lee
ringa_lee 2017-04-17 17:52:40
0
3
921
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

全員に返信(3)
黄舟

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

になることと同等です。

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

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

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

つまり、__name__ は特定の定義

に基づいています。

別の例として

リーリー
いいねを押す +0
洪涛

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

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

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

いいねを押す +0
Peter_Zhu

リーリー

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート