保留签名的Python装饰器(闭包版本)
我的装饰是“封闭式”;它在返回修饰过的函数之前做一些工作 借用这个著名的问题:保留签名的Python装饰器(闭包版本),python,python-2.7,decorator,Python,Python 2.7,Decorator,我的装饰是“封闭式”;它在返回修饰过的函数之前做一些工作 借用这个著名的问题: functools.wrapps在Python 2中不保留签名 from functools import wraps def args_as_ints(f): time.sleep(1) # hard at work @wraps(f) def g(*args, **kwargs): args = [int(x) for x in args] kwar
functools.wrapps
在Python 2中不保留签名
from functools import wraps
def args_as_ints(f):
time.sleep(1) # hard at work
@wraps(f)
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g
@args_as_ints
def funny_function(x, y, z=3):
"""Computes x*y + 2*z"""
return x*y + 2*z
help(funny_function)
显示
decorator
模块似乎不支持这种风格的decorator
同样相关:您可以使用该模块
请记住,wrapt
decorator与标准python decorator具有不同的接口。我强烈建议你阅读这本书。无论如何,这里有一个使用wrapt.decorator
的decorator的基本实现:
import wrapt
def args_as_ints(f):
time.sleep(1) # hard at work
@wrapt.decorator
def g(f, instance, *args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g(f) # apply the decorator to the function
请注意,我的实现完全忽略了实例
参数,因此对于实例方法它无法正常工作
但是,它确实保留了修饰函数的签名:
Help on function funny_function in module __main__:
funny_function(x, y, z=3)
Computes x*y + 2*z
在这里找到了答案:
您是否阅读了有关
functools.wrapps
的部分?请澄清。你的问题是什么?您的装饰师在我的机器上正常工作:。请注意,这个著名的问题已经有十年历史了,所以它可能会推荐不再需要的技术。@NilsWerner:哪一部分?我试过了,它没有保留签名请用你所有的努力来修正你的问题对不起,我没有领会你的意思。。。
import wrapt
def args_as_ints(f):
time.sleep(1) # hard at work
@wrapt.decorator
def g(f, instance, *args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g(f) # apply the decorator to the function
Help on function funny_function in module __main__:
funny_function(x, y, z=3)
Computes x*y + 2*z
def args_as_ints(f):
time.sleep(1)
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return decorator.FunctionMaker.create(
f, 'return decfunc(%(signature)s)',
dict(decfunc=g, __wrapped__=f))