2016-05-09 42 views
-2

這是一個基本問題。有沒有在做* args,** kwargs與用tuple和dict調用有什麼區別?

def foo(*args, **kwargs): 
    """standard function that accepts variable length.""" 
    # do something 

foo(v1...vn, nv1=nv1...nvn=nvn) 

def foo(arg, kwargs): 
    """convention, call with tuple and dict.""" 
    # do something 

mytuple = (v1, ..vn) 
mydict = {nv1=nv1, ...nvn=nvn} 
foo(mytuple, mydict) 

我可以做同樣的事情雙全,除了後面有創造一個tupledictionary的一個奇怪的慣例不同。但基本上有區別?我可以解決處理無限事物的相同計算問題,因爲無論如何,dicttuple都可以照顧到這一點?

這是Python的一個慣用部分,也就是好的句法糖對於你做的事情呢? I function將爲您處理這個問題!

PS:雖然我同意這是Why use packed *args/**kwargs instead of passing list/dict?的副本,但不確定有那麼多的downvotes,可能它應該在重複的信息中更正。這個問題已經收到了讚揚。那麼我是否因爲無法找到那個而低估?

+2

您可以*在片段中看到差異*第一個版本允許您傳遞任意位置和關鍵字參數,第二個版本要求您傳遞兩個參數。 – jonrsharpe

+0

但是,我可以解決我原來的問題處理inifinte長度的項目。元組和Dicts已經無限大? – Nishant

+1

http://stackoverflow.com/questions/33542959/why-use-packed-args-kwargs-instead-of-passing-list-dict?rq=1 – warvariuc

回答

1

argskwargs只是名稱。
這裏真正重要的是***

在你的第二個例子中,你只能用2個參數調用函數,第一個例子中你可以用基本上無限的參數調用函數。

+0

但是,用元組和字典調用它的約定實際上解決了我獲得無限項目的問題。 – Nishant

+0

@Nishant:'foo(* sequence,** mapping)'也是如此。 –

+0

@Nishant不,這裏沒有魔法。實際上,您應該避免使用名稱「tuple」,因爲它會隱藏內置名稱。 – DeepSpace

相關問題