我有函数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)