将位置参数映射到关键字参数

时间:2016-05-11 18:43:44

标签: python

是否有一种干净的方法可以将位置参数映射到您要调用的函数的关键字参数?

例如,我即将调用下面的函数

def test(a, b=None, c=None):

我会传入

test(*args, **kwargs)

我知道a会收到1

在将*args传递给函数之前,是否存在将{a: 1}映射到**kwargs的通用方法?

这样我就可以使用cellForRowAtIndexPath:来确定传入了哪些参数。

1 个答案:

答案 0 :(得分:0)

我不知道这是否是您正在寻找的内容,但它是如何使用inspect.getargspec()的示例:

import inspect

def _call_fn(fn, *args, **kwargs):
    argspec = inspect.getargspec(fn)
    _args = []
    _kw = {}
    _argspec_args = argspec.args[:]

    if args:
        # pass positional parameters given to us through
        _args += list(args)
        # skip the parameters we've matched
        _argspec_args = _argspec_args[len(args):]

    for argname in _argspec_args:
        if argname in kwargs:
            _args.append(kwargs.pop(argname))
        else:
            raise TypeError("%s expected parameter %s" % (fn.__name__, argname))

    if argspec.keywords is not None and kwargs:
        _kw.update(kwargs)

    # print _args, _kw
    return fn(*_args, **_kw)


def f(a, b, c, d):
    print a, b, c, d

它将匹配给予所需参数的参数,以便您可以提供额外的参数而不会导致TypeError

_call_fn(f, 1, 2, d=2, c=3, b=4, q=42)

位置参数具有首选项,因此以上内容将打印1 2 3 21 2来自前两个参数,3来自c=32来自{{ 1}}。d=2b=4将被丢弃。