不允许使用多个**参数的解决方法



我有函数foo1和foo2,我想通过**kwargs使用它们。但是,如果我将它们分为**kwargs_for_a和**kwargs_for_b,这是不允许的,如果我使用一个**kwargs,那么最终的b2=30将在foo1中引发错误,因为foo1没有任何名为b2的参数。我该怎么做?

def foo1(a1, a2=3, a3=4):
return a1 + a2 + a3

def foo2(b1, b2=3):
return b1 + b2

def main(a1, b1, **kwargs_for_a, **kwargs_for_b):
return foo1(a1, **kwargs_for_a) + foo2(b1, **kwargs_for_b)

main(2, 3, a2=10, b2=30)

不要只要需要区分,就把你的夸尔格作为单独的dict。

def main(a1, b1, kwargs_for_a, kwargs_for_b):
return foo1(a1, **kwargs_for_a) + foo2(b1, **kwargs_for_b)

main(2, 3, dict(a2=10), dict(b2=30))

请记住,**kwargs获取所有剩下的关键字参数,而不仅仅是其中一个。只存在一个";所有关键字参数";设置

这不是一个好的练习,只是为了好玩。

这里有一种方法,它尝试在foo1上使用所有提供的kwarg,检测哪些不是意外的,拒绝它们并在foo2中使用它们。

def foo1(a1, a2=3, a3=4):
return a1 + a2 + a3

def foo2(b1, b2=3):
return b1 + b2

def main(a1, b1, **kwargs):

rejected_kwargs = {}
while True:
try:
r1 = foo1(a1, **kwargs)
break
except TypeError as e:
message = "foo1() got an unexpected keyword argument "
if not str(e).startswith(message):
raise e
else:
key = str(e).split(message)[1].strip("'")
rejected_kwargs[key] = kwargs.pop(key) # Here, `b2` was rejected by `foo1` and is now available for `foo2`. 

r2 = foo2(b1, **rejected_kwargs)

return r1 + r2

main(2, 3, a2=10, b2=30)

最新更新