def log(func):
def wraper(*a, **kw):
return func(*a, **kw)
return wraper
@log
def f():
print 'f'
print locals()['f'] # - prints <function wraper at 0x00CBF3F0>.
你如何获得真正的f对象(不是装饰器包装)?
答案 0 :(得分:7)
functools模块还提供了一个wraps
装饰器,它确保包装函数看起来更像真实函数:例如,正确的名称,模块和文档字符串。
答案 1 :(得分:5)
你没有。 1 如果你以后需要访问它,请存储它。
def log(func):
def wrapper(*a, **kw):
return func(*a, **kw)
wrapper.func = func
return wrapper
@log
def f():
print 'f'
print f.func
1 你可能会搞乱关闭,但我不推荐它。
答案 2 :(得分:0)
如果您正在运行python 3.2或更高版本,并且使用functools.wraps
,那么您将在__wrapped__
属性上找到包装函数:
from functools import wraps
def log(func):
@wraps(func)
def wrapper(*a, **kw):
return func(*a, **kw)
return wrapper
@log
def f():
print 'f'
print f.__wrapped__
functools.wraps
是一个便利函数,用于使用执行所有工作的函数来装饰一个修饰函数,包括添加此属性functools.update_wrapper
。