2017-08-07 15 views
2
def foo(l=None, d=None): 
    return bar(*l, **d) # eg. bar(1, 2, 3, a=a, b=b) 

入力:lは、すなわちNoneとき同じパラメータに両方のリストと辞書を開梱

l = [1, 2, 3] 
d = {'a': a, 'b': b} 

foo(l=l, d=d) 

問題が生じました。この呼び出しが行われます

私はリストとうまくdictの両方に NoneTypeを処理するために fooに変更できますか何
foo(d={'a':a}) 

これは醜いです、これよりも良い方法がなければならない:

def foo(l=None, d=None): 
    if l is not None and d is not None: 
     return bar(*l, **d) 
    if l is not None: 
     return bar(*l) 
    if d is not None: 
     return bar(**d) 
+0

*より良い*方法は、単にリストと辞書の引数を公開するラッパー関数 'foo'を持っていないだろう。変数/キーワードの引数を持つ場合は、関数のシグネチャにその変数を公開するだけで、ユーザーは使用できることを知ることができます。 – poke

+0

'lがNoneではなく、dがNoneでない場合:'醜いですが、もしlとdの場合: –

答えて

4

あなたはorを使用して空の反復可能オブジェクトと短絡することができます:

def foo(l=None, d=None): 
    return bar(*(l or()), **(d or {})) 

かと、より詳細なとはいえ、それが読みやすく:

def foo(l=None, d=None): 
    l = l or() 
    d = d or {} 
    return bar(*l, **d) 
2

ではなくNoneのデフォルト引数として空のタプルと空の辞書を使用します。

def foo(l=(), d={}): 
    return bar(*l, **d) 

あなたがする必要があります変更可能なデフォルト引数であるため、をfoo関数内で変更しないように注意してください("Least Astonishment" and the Mutable Default Argumentも参照)。あなたは慎重になりたい場合は、immutable dictionaryを使用することができます。

from types import MappingProxyType # requires python 3.3 

def foo(l=(), d=MappingProxyType({})): 
    return bar(*l, **d) 
+0

なぜタプルですか?なぜ 'l 'の空リストはありませんか? – stybl

+3

dictsは変更可能であるため、 'd = {}'についてはわかりません。 –

+0

@MosesKoledoye関数の唯一の目的がdictを展開している場合、dictを変更することはできません。 – MSeifert

-1

親切にチェックし、このヘルプはあなた..

ウィル

出力:

(1, 2, 3) 
{'a': 'a', 'b': 'b'} 

(1, 2, 3) 
{} 

() 
{'a': 'a', 'b': 'b'} 
関連する問題