传递kwarg给被包装函数,当包装器有相同参数时

3
假设我有一个函数,用于包装其他函数,比如 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函数的。

有没有什么解决方法?


1
听起来你需要更具描述性的参数名称。 - mhlester
当你没有编写函数时,你不能选择参数名称。 - Ian Sudbery
2个回答

3

这里是使用functools.partial的绝佳场所。该函数返回一个部分对象,该对象将像一个函数一样工作,允许map函数正常运行,同时也允许您提前更改关键字参数。在这种情况下,您只需执行map(functools.partial(x, iterable=[5,6,7,8]), [1,2,3,4])即可。


0

为了简化您的问题,我有一个函数,它至少需要一个普通参数和一个关键字参数。

def fun(x, y, **karg):
    print x, y, karg

我们不能在karg中使用x或y。为什么? Python支持另一个特性“通过名称匹配调用函数”,参数不必在相同的位置。我们总是可以这样调用fun
fun(y = 12, x = 6)

因此,当我们将普通参数名称用作关键字参数时,这对于Python来说显然是有歧义的。 虽然可以通过一些技巧来解决这个问题,但最好在关键字参数中使用不同的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接