如何以编程方式更改Python装饰器中的功能的ARGSPEC?
-
03-10-2019 - |
题
给定功能:
def func(f1, kw='default'):
pass
bare_argspec = inspect.getargspec(func)
@decorator
def func2(f1, kw='default'):
pass
decorated_argspec = inspect.getargspec(func2)
我如何创建一个装饰仪 bare_argspec == decorated_argspec
?
(关于原因,称为装饰功能的框架确实会检查要选择的内容,因此装饰器必须保留相同的argspec才能播放。关于框架为什么很烂的讲话,这不是我想要的;我必须在这里解决问题。另外,我也对答案感兴趣)
解决方案
Michele Simionato的 装饰器模块 有一个名为Decorator的装饰器,可保留功能Argspecs。
import inspect
import decorator
def func(f1, kw='default'):
pass
bare_argspec = inspect.getargspec(func)
print(bare_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))
@decorator.decorator
def mydecorator(func,*args,**kw):
result=func(*args,**kw)
return result
@mydecorator
def func2(f1, kw='default'):
pass
decorated_argspec = inspect.getargspec(func2)
print(decorated_argspec)
# ArgSpec(args=['f1', 'kw'], varargs=None, keywords=None, defaults=('default',))
assert(bare_argspec==decorated_argspec)
其他提示
有 装饰师 模块:
from decorator import decorator
@decorator
def trace(func, *args, **kw):
print 'calling', func, 'with', args, kw
return func(*args, **kw)
这使得 trace
具有与装饰功能相同的Argspecs的装饰器。例子:
>>> @trace
... def f(x, y=1, z=2, *args, **kw):
... pass
>>> f(0, 3)
calling f with (0, 3, 2), {}
>>> from inspect import getargspec
>>> print getargspec(f)
ArgSpec(args=['x', 'y', 'z'], varargs='args', keywords='kw', defaults=(1, 2))
是 functools.update_wrapper()
和/或 functools.wraps()
够好了?
不隶属于 StackOverflow