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

의 구체적인 정의를 바탕으로 한 것입니다.

또 다른 예로

으아아아
洪涛

장식된 기능은 사실 Now 기능이 아닙니다

하지만 log("rain")(now)
사실은 여러분이 정의한 래퍼입니다.

이 문제에 대해 __name__ 등을 올바르게 설정할 수 있는 functools의 랩이 있습니다.

Peter_Zhu

으아아아

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿