2013-04-12 30 views
10

pythonic値がまだ設定されていない場合はdictに値を設定する方法はありますか?値がまだ設定されていない場合にのみ、値を設定してください

現時点では私のコードは、if文を使用しています。

if "timeout" not in connection_settings: 
    connection_settings["timeout"] = compute_default_timeout(connection_settings) 

dict.get(key,default)は辞書を消費するコードのためではなく、別の関数に渡される辞書を準備しているコードに適しています。

connection_settings["timeout"] = connection_settings.get("timeout", \ 
    compute_default_timeout(connection_settings)) 

は、dictにキーが含まれていても計算機能を評価しますが、それ以外のものは設定できません。バグ。

デフォルトの値は、デフォルト値が同じ場合です。

もちろん、デフォルト値として計算する必要のないプライマリ値を設定することは何度もありますが、もちろんdict.setdefaultを使用することもできます。しかしもっと複雑なケースはどうでしょうか?これを行うには

+0

あなたの質問のタイトルを「他の関数に渡すためにデフォルトのkwarg値を設定する方法」のようなより正確なものにぶら下げてください。私はタイトルがあまりにも一般的だと感じています。 –

答えて

7

これは、非答えのビットですが、私はあなたがそれを持っているように、ほとんどのニシキヘビがif文であると言うでしょう。あなたは__setitem__または他の方法でそれをワンライナーにする衝動に抵抗しました。 and/orハッキングを短絡して賢明にしようとすると、既存の、しかし間違った値が原因でロジックにバグが発生するのを避けることができます。コンピューティング機能が必要でないときには使用されないことはすぐに分かります。

明快で簡潔で可読性があります。 - pythonicです。

2

一つの方法は次のとおりです。

if key not in dict: 
    dict[key] = value 
+1

上記のとおり、[setdefault](https://docs.python.org/2/library/stdtypes.html#dict.setdefault)はこれを行います。 – slaughter98

17

dict.setdefaultは、「値がまだ設定されていない場合にのみ、値を設定します」という質問になります。しかし、パラメータとして渡すために値を計算する必要があります。これはあなたが望むものではありません。

+2

将来のgooglerに:これは質問者が望んでいた答えではないかもしれませんが、答えはあなたが望むものです。 – CoreDumpError

+0

@CoreDumpErrorこのコメントは多くの一般的な質問にする必要があります:) –

1

私は非デフォルト値にkwargsからを変更し、別の関数に渡すために、次を使用しています:

def f(**non_default_kwargs): 

    kwargs = { 
     'a':1, 
     'b':2, 
    } 
    kwargs.update(non_default_kwargs) 

    f2(**kwargs) 

これは、あなたが入力する必要はありません

  • というメリットがありますキーは二回

  • すべて

    は、単一の機能

012で行われます
+1

私はあなたがユースケースについてあまりにも多くを仮定していると思います。営業担当者は、既存の事前計算された適切なデフォルトの集まりを持っていない(または望むことさえあろう)かもしれない。 – wim

-2

おそらくdict.setdefaultが必要になります。

は新しい辞書を作成し、値を設定します。値が既に設定され

>>> d = {} 
>>> d.setdefault('timeout', 120) 
120 
>>> d 
{'timeout': 120} 

場合、dict.setdefaultはそれを上書きしません。

>>> d['port']=8080 
>>> d.setdefault('port', 8888) 
8080 
>>> d 
{'port': 8080, 'timeout': 120} 
+1

"はdictがキーを含んでいても計算機能を評価するでしょう; bug" – wim

+0

これはバグではありません: 'dict.get()'を呼び出す前に 'compute_default_timeout()'を呼び出さなければなりません。しかし、それは正しい行動です。 –

+0

見積もりは質問からのものなので、OPが既にバグを考慮しているものと同等であることは明らかです(私はバグとは言いませんが、この場合は不要で望ましくありません)。 – wim

-1

はこれを試してみてくださいライナー:

connection_settings["timeout"] ||= compute_default_timeout(connection_settings) 
+0

これはどのPythonですか? 2.7では無効な構文である – Will

+2

ありがとう、これは私が探していたものでした!とてもエレガント! –

+1

ありがとう、 'SyntaxError'はまさに私が探していたものです! – wim

関連する問題