在像
这样的函数中def myfunc(a, b, **kwargs):
do someting
如果我传入的命名参数已经有关键字“a”,则调用将失败。
目前我需要用其他地方的字典调用myfunc(所以我无法控制字典的内容),比如
myfunc(1,2, **dict)
如何确保没有冲突?如果有,解决方案是什么?
如果有办法写一个装饰器来解决这个问题,因为这可能是一个常见问题?
答案 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)