Python 按字符串名称获取修饰的函数对象 def日志(func): def包装机(*a,**千瓦): 返回函数(*a,**kw) 回程包装机 @日志 def(): 打印“f” 打印局部变量()['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您可能会弄乱闭包,但我不建议您这样做。您
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可能不想要这个函数,只是需要一个属性。