我有函式 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)
uj5u.com熱心網友回復:
別。只要需要區分,就將您的 kwargs 作為單獨的 dicts 保存。
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獲取所有剩下的關鍵字引數——而不僅僅是其中一個。只存在一個“所有關鍵字引數”集。
uj5u.com熱心網友回復:
這不是一個好習慣,只是為了好玩。
這是一種嘗試使用所有提供的 kwargs on 的方法foo1,檢測哪些不是意外的,拒絕它們并在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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/454722.html
標籤:Python
