通过字符串名称获取装饰的函数对象

1 投票
3 回答
1186 浏览
提问于 2025-04-15 20:13
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 你可以尝试修改闭包,但我不建议这样做。

撰写回答