通过字符串名称获取装饰的函数对象
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 对象(而不是被装饰器包裹的那个)?
3 个回答
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
)一起添加上去。
7
functools模块里还有一个叫做wraps
的装饰器,它的作用是让被包装的函数看起来更像原来的函数,比如说它的名字、所在的模块和文档说明都能正确显示。
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 你可以尝试修改闭包,但我不建议这样做。