有没有办法从inspect.getcallargs(func)
到*args, **kw
对的返回值返回,实际上可以用来调用func
?
用例:说我正在写装饰器,我想通过名称更改函数的特定参数。以下是一些代码的开头:
@fix_x
def a(x):
print x
@fix_x
def b(**q):
print q['x']
def fix_x(func):
def wrapper(*args, **kw):
argspec = inspect.getargspec(func)
callargs = inspect.getcallargs(func, *args, **kw)
if 'x' in callargs:
callargs['x'] += 5
elif 'x' in callargs[argspec.keywords]:
callargs[argspec.keywords]['x'] += 5
# ...and now I'd like a simple way to call func with callargs...?
(我实际上正在做一些关于构建它们之间的callargs并希望与它们进行调用的更详细的内容,但这应该让我知道我在寻找什么。)
答案 0 :(得分:3)
不,目前还没有一种好的方法可以做到这一点,但它正在为Python 3.3工作!
请参阅PEP 362 -- Function Signature Object了解此新功能的工作原理。
答案 1 :(得分:0)
我已经编写了自己的代码(或多或少)这样做。它在https://github.com/codemage/wmpy
中ArgSpec.make_call_args
语义略有不同;也就是说,它仍然只是将任何未知的args分流到** kw,而不是接受以** kw参数命名的单独的条目dict,但如果我需要,这很容易改变。
通过一点努力,这可能会变成一个相当完整的“backport”(引用,因为它显然不会共享代码)PEP 362到Python 2.7。它不执行仅限关键字的参数,但是那些在2.x中不存在,因此不会影响API完整性,并且检查模块提供所有其他非重要的机制。