Python 按字符串名称获取修饰的函数对象 def日志(func): def包装机(*a,**千瓦): 返回函数(*a,**kw) 回程包装机 @日志 def(): 打印“f” 打印局部变量()['f']#-打印。

Python 按字符串名称获取修饰的函数对象 def日志(func): def包装机(*a,**千瓦): 返回函数(*a,**kw) 回程包装机 @日志 def(): 打印“f” 打印局部变量()['f']#-打印。,python,string,function,decorator,Python,String,Function,Decorator,如何获得真正的f对象(不是装饰包装)?如果以后需要访问它,则不存储它 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>. 1您可能会弄乱闭包,但我不建议您这样做。您

如何获得真正的f对象(不是装饰包装)?

如果以后需要访问它,则不存储它

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>.
1您可能会弄乱闭包,但我不建议您这样做。

您不需要。1如果以后需要访问,请将其存储起来

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>.

1您可能会弄乱闭包,但我不推荐它。

该模块还提供了一个
包装
装饰器,确保包装的函数看起来更像真正的函数:正确的名称、模块和docstring,例如。

模块还提供了一个
wrapps
装饰器,确保包装的函数看起来更像真实的函数:例如,正确的名称、模块和docstring。

如果您运行的是python 3.2或更高版本,并且您使用了它,那么您将在
\uuuuuuwrapped\uu
属性中找到包装的函数:

def log(func):
  def wrapper(*a, **kw):
    return func(*a, **kw)
  wrapper.func = func
  return wrapper

@log
def f():
  print 'f'

print f.func

functools.wrapps
是一个方便的函数,用于用完成所有工作(包括添加此属性)的函数装饰装饰装饰函数。

如果您运行的是python 3.2或更高版本,并使用它,则您将在
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
属性上找到包装函数:

def log(func):
  def wrapper(*a, **kw):
    return func(*a, **kw)
  wrapper.func = func
  return wrapper

@log
def f():
  print 'f'

print f.func

functools.wrapps
是一个方便的函数,用于用完成所有工作的函数来修饰修饰函数,包括添加此属性。

+1这可能是公认的答案,因为
functools.wrapps
不仅仅是设置
wrapper.func=func
,wrapps似乎并不完全符合OP的要求:它没有在某个地方保留原始函数。但这可能是OP不想要函数,只是需要一个属性。+1这可能是公认的答案,因为
functools。wrapps
不仅仅是设置
wrapper.func=func
。实际上,wrapps似乎并不完全符合OP的要求:它没有在某个地方保留原始函数。但是OP可能不想要这个函数,只是需要一个属性。