2016-05-09 13 views
-2

これは基本的な質問です。私は、後にはtupledictionary作成の奇妙な規則を持っていることを除いて、両方で同じことを行うことができ* 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) 

を行うことの違いがあります。しかし、基本的に違いはありますか? dicttupleが私のためにそれをどうにかして扱うことができるので、無限のものを扱うのと同じ計算上の問題を解決できますか?

これは、Pythonの慣用的な部分のことですか?いいですか。構文糖あなたはとにかく何をしていますか?私はfunctionあなたのためにこれを処理するつもりです!

PS:これはWhy use packed *args/**kwargs instead of passing list/dict?のコピーであると私は同意しますが、重複した情報で修正する必要があります。そして、その質問はアップホーを受け取りました。だから私はそれを見つけることができないためにdownvotesされていますか?

+2

スニペットで*の違いを見ることができます - 最初のバージョンでは任意の位置とキーワードの引数を渡すことができ、2番目のバージョンでは正確に2つの引数を渡す必要があります。 – jonrsharpe

+0

しかし、私は両方とも私の元の問題を解決することができます不具合の長さの項目を扱う。タプルとDictsはすでに無限大ですか? – Nishant

+1

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

答えて

1

argsおよびkwargsは単なる名前です。
ここで本当に重要なのは***です。

2番目の例では、基本的に無限の引数で関数を呼び出すことができる最初の例に対して、2つの引数で関数を呼び出すことができます。

+0

しかし、タプルと辞書でそれを呼び出すという慣習は、無限のアイテムを手に入れるという問題を実際に解決しますか? – Nishant

+0

@Nishant: 'foo(* sequence、** mapping)'もそうです。 –

+0

@Nishant No.ここには魔法は関係しません。組み込みの名前をシャドーするので、実際には 'tuple'という名前の使用を避けるべきです。 – DeepSpace

関連する問題