假设有一个包含其他函数的函数,例如map,其签名如下:
def map(func, iterable, *args, **kwargs)
现在假设我有一个函数x,其签名是:
def x(a, b=None, c=0, d=100, iterable=list())
如果我试着打电话
map(x, [1,2,3,4], iterable=[5,6,7,8])
我将获得一个TypeError,因为map函数已经传递了" iterable"参数两次,即使其中一个用于map函数而另一个用于传递给x函数。
这周围有吗?
答案 0 :(得分:3)
这是一个使用functools.partial的好地方。此函数返回partial,其行为类似于允许map工作的func,但也允许您提前更改关键字。在这种情况下,您应该做的只是map(functools.partial(x, iterable=[5,6,7,8]), [1,2,3,4])
答案 1 :(得分:0)
为了简化你的问题,我有一个函数,它至少需要一个普通参数,然后是关键字参数
def fun(x, y, **karg):
print x, y, karg
我们不能在karg中使用x或y。为什么? Python支持另一个“在调用函数时按名称匹配”的功能,参数不必位于相同的位置。我们总是可以称之为
fun(y = 12, x = 6)
因此,当我们使用普通参数名作为关键字参数时,对于python来说这显然是模棱两可的。 可能有一些黑客可以解决这个问题但是在关键字参数中使用不同的名称会更好。