5

次のコードを検討してください。

>>> def default_answer():
...     print "Default was required!"
...     return 100
... 
>>> g = { 'name': 'Jordan', 'age': 35 }
>>> result = g.get('age', default_answer())
Default was required!
>>> result = g.pop('age', default_answer())
Default was required!

g期待されるキーが含まれているかどうかに関係なく、default_answerが呼び出されることに注意してください。これはプログラム的には理にかなっていますが、default_answer計算コストが高い場合、これは面倒です(多くのコードを実行して、破棄される値を作成する)。

いつも電話せずにこれを書くことを考えることができる唯一の方法default_answerは次のとおりです。

result = g.pop('age', False) or default_answer()

これはそれを行うための最良の方法ですか?

(遅延評価を使用してオブジェクトに置き換えることでdefault_answerもこの問題の一部が解決されることを認識していますが、それはこの質問の範囲外です)。

4

2 に答える 2

10

いいえ、これはこれを行うための最良の方法ではありません。結果g.pop()が「偽」である可能性があるためです。代わりにtry/を使用してください:except

try:
    result = g.pop('age')
except KeyError:
    result = default_answer()

このイディオムはEAFPと呼ばれ、通常、さまざまな理由でLBYLよりも優先されます。

  1. キーを2回検索することを回避します(これは実際の問題ではありませdictんが、他のマッピングでは最適ではない可能性があります)。

  2. スレッデッドコードの競合状態を回避します。

  3. 多くの人が読みやすいと感じています。

于 2012-08-27T18:53:25.217 に答える
2

これは、boolean-false値(Falseだけでなく、空の文字列、空のリストなど)をデフォルトに置き換える必要があることを知っている限り、問題ありません。いつでも明示的に行うことができます。

if 'age' in g:
    result = g['age']
else:
    result = default_answer()

(または、最初に値を読み取り、except句でデフォルトを実行するtry /exceptを使用した同等のバージョン。どちらが適切かは、値が欠落しているケースが一般的であるか一般的でないかによって異なります。)

于 2012-08-27T18:53:54.623 に答える