如果kwargs中的键与function关键字冲突怎么办?

时间:2014-08-11 02:44:51

标签: python kwargs

在像

这样的函数中
def myfunc(a, b, **kwargs):
    do someting

如果我传入的命名参数已经有关键字“a”,则调用将失败。

目前我需要用其他地方的字典调用myfunc(所以我无法控制字典的内容),比如

myfunc(1,2, **dict)

如何确保没有冲突?如果有,解决方案是什么?

如果有办法写一个装饰器来解决这个问题,因为这可能是一个常见问题?

3 个答案:

答案 0 :(得分:3)

如果你的函数是从其他地方获取一个实际的dict,你不需要使用**传递它。只需像正常的论点一样传递dict:

def myfunc(a, b, kwargs):
    # do something

myfunc(1,2, dct) # No ** needed

如果**kwargs被设计为采用任意数量的关键字参数,则只需使用myfunc。像这样:

myfunc(1,2, a=3, b=5, something=5)

如果你只是传递一个字典,那就不需要了。

答案 1 :(得分:2)

如果这是一个严重的问题,请不要为你的论点命名。只需使用splat参数:

def myfunc(*args, **kwargs):
    ...

并手动解析args

答案 2 :(得分:0)

2件事:

  • 如果myfunc(1,2, **otherdict)来自其他地方,而您无法控制otherdict中的内容 - 那么您无能为力,他们就是&#39} ;重新调用你的功能错误。调用函数需要确保没有冲突。

  • 如果您是调用函数...那么您只需要自己合并dicts。即:

X

otherdict = some_called_function()`
# My values should take precedence over what's in the dict
otherdict.update(a=1, b=2)
# OR i am just supplying defaults in case they didn't
otherdict.setdefault('a', 1)
otherdict.setdefault('b', 2)
# In either case, then i just use kwargs only.
myfunc(**otherdict)