1

これは、これを行うための「優れた」pythonic方法に対する好奇心の質問にすぎません。

オプションのパラメータを持つ関数があります。

def foo( a, b, c='en' ):
    print c

たくさんの情報が含まれているdictがあり、特定のキーがdictにある場合は、それをfooに渡して、cのデフォルトをオーバーライドしたいのですが、キーがdictにない場合は、使用したいだけです。 cのデフォルト。

明らかにこれはうまくいくでしょう...

if "SomeKey" in mydict:
    foo( val1, val2, mydict[ "SomeKey" ]
else:
    foo( val1, val2 )

そして別のオプションは次のようなことをすることです

params = [ val1, val2 ]
if "SomeKey" in mydict:
    params.append( mydict[ "SomeKey" ] )
foo( *params )

しかし、これを行うには、より洗練された、よりパイソン的な方法が必要ですか?すなわち。

foo( val1, val2, mydict[ "SomeKey" ] if "SomeKey" in mydict else < use default > )

前もって感謝します!

4

3 に答える 3

4

デフォルトがわかっている場合は、次を使用できますdict.get

foo(val1, val2, mydict.get('SomeKey', 'en'))
于 2012-10-26T17:34:06.097 に答える
4

これには「真の」デフォルト値を使用しないでください。代わりに、プレースホルダー値を使用してください。

def foo( a, b, c=None ):
    if c is None:
        c = 'en'
    print c

そして、ただ電話して...

foo( val1, val2, mydict.get("SomeKey") )

(デフォルトでは、キーがdictにない場合に.get()返されます)None


を変更できない場合foo()は、より複雑なvarargsパスを実行できます。

maybe_c = {'c': mydict["SomeKey"]} if "SomeKey" in mydict else {}
foo( val1, val2, **maybe_c )
于 2012-10-26T17:34:48.067 に答える
2

あなたは混乱することができますfooか?

def foo(a,b,c='en',**kwargs):
    ...

次に、辞書でそれを呼び出します。

foo('bar','baz',**mydict)

それを行うための醜い方法(それはfooを台無しにしない)は次のようになります:

foo( val1,val2,mydict[ "SomeKey" ]) if "SomeKey" in mydict else foo(val1,val2)

実際には、私の好みの方法はfoo 、KeyErrorを発生させることができないと仮定すると、次のよう'SomeKey'になります。

try:
    foo(val1,val2,c=mydict['SomeKey'])
except KeyError:
    foo(val1,val2)

これにより、キールックアップの繰り返しが回避され、デフォルトの引数を使用して関数を呼び出していることが明示されます。


または、phihagが述べたようにinspectプラスを使用します。dict.get

foo(val1,val2,mydict.get('SomeKey',inspect.getargspec(foo).defaults[0]))

これを使用し、foo繰り返し検査される場合は、アクセスできる場所に結果を保存することをお勧めします。

于 2012-10-26T17:33:49.517 に答える