假設我有以下功能:
def sub1(a,b,foo="bar"):
print(a b)
print(foo)
def main(*args,**kwargs):
a,b = args
sub1(a,b,**kwargs)
我可以
main(2,3) #5, bar
main(2,3,foo="baz") #5, baz
這作業正常。
但是說我已經決議了一個 additioanl 關鍵字引數,例如
main(2,3,qux="baz") #TypeError: sub1() got an unexpected keyword argument 'qux'
我們為什么要這樣做?假設我有一個額外的函式,它共享一些引數,sub1但也有一些不同的引數
def sub2(foo,qux="fred"):
print(foo)
print(f"Hello {qux}")
然后而不是必須做
def main(*args,**sub1kwargs,**sub2kwargs):
sub1(**sub1kwargs)
sub2(**sub2kwargs)
我們可以只決議相同的kwargs東西,函式只需要它需要的東西:
def main(*args,**kwargs):
sub1(**kwargs)
sub2(**kwargs)
當然,我們可以在將引數決議為sub1, (或使用foo = kwargs.get("foo","bar)in sub1)之前回圈遍歷引數串列,但我想知道,如果我們可以避免這樣做并且只有一個kwargs?
uj5u.com熱心網友回復:
“顯式優于隱式。”
通過匿名傳遞并沒有什么真正的好處kwargs。函式應該盡可能地命名它們的關鍵字引數。并且像您main這樣的呼叫者不會通過保存奇數位元組的代碼來提高質量或可讀性。在需要的地方處理/過濾 kwarg。任何一個
def main(*args, foo="bar", qux="baz"):
sub1(*args, foo=foo)
sub2(qux=qux)
或者
def main(*args, **kwargs):
sub1(*args, foo=kwargs.get("foo"))
sub2(qux=kwargs.get("qux"))
將完成作業并且易于理解。
當然,你可以定義一個像 (do NOT )這樣的函式:
def sub1(a, b, **kwargs):
print(a b)
print(kwargs.get("foo", "bar"))
這將允許呼叫者傳遞將被忽略的隨機 kwargs,但它使呼叫者更難找出此函式真正需要什么 kwargs。
uj5u.com熱心網友回復:
你可以做到,只需將 kwargs 添加到 sub1,它就會自動決議你提供的任何命名引數,其余的將放入 kwargs:
def sub1(a, b, foo="bar", **kwargs):
這樣你仍然可以使用或不使用 foo 呼叫 sub1,但你也可以使用或不使用其他引數呼叫它而不會導致錯誤。
main(1, 2, foo="hello")
> 1, 2, "hello"
main(1, 2, qux="hello")
> 1, 2, "bar"
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327754.html
上一篇:python中的布林值函式
