标准库中的Python inspect.getcallargs是否存在逆操作?

时间:2012-06-07 22:42:36

标签: python

有没有办法从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并希望与它们进行调用的更详细的内容,但这应该让我知道我在寻找什么。)

2 个答案:

答案 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完整性,并且检查模块提供所有其他非重要的机制。