是否有一种干净的方法可以将位置参数映射到您要调用的函数的关键字参数?
例如,我即将调用下面的函数
def test(a, b=None, c=None):
我会传入
test(*args, **kwargs)
我知道a
会收到1
。
在将*args
传递给函数之前,是否存在将{a: 1}
映射到**kwargs
的通用方法?
这样我就可以使用cellForRowAtIndexPath:
来确定传入了哪些参数。
答案 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 2
(1 2
来自前两个参数,3
来自c=3
,2
来自{{ 1}}。d=2
和b=4
将被丢弃。