按字符串名称获取修饰的函数对象

时间:2010-03-09 22:59:29

标签: python string function decorator

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 :(得分: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