5

有没有办法从返回值返回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 做一些更精细的事情,但这应该让我知道我在寻找什么。)

4

2 回答 2

3

不,目前没有很好的方法来做到这一点,但是它正在为 Python 3.3 工作!

请参阅PEP 362 -- 函数签名对象以了解此新功能将如何工作。

于 2012-06-07T22:49:55.257 回答
0

我已经编写了自己的代码来(或多或少)做到这一点。它ArgSpec.make_call_args位于https://github.com/codemage/wmpy

语义略有不同;也就是说,它仍然会将任何未知的 args 分流到 **kw,而不是接受以 **kw 参数命名的单独条目字典,但如果我需要,这很容易更改。

稍加努力,这可能会变成PEP 362到 Python 2.7 的相当完整的“反向移植”(用引号引起来,因为它显然不会共享代码)。它不执行仅关键字参数,但无论如何这些在 2.x 中都不存在,因此不会影响 API 的完整性,并且检查模块提供所有其他重要的机制。

于 2012-06-09T05:43:01.320 回答