Jochen Ritzel の答えは、これを 99.9999% の確率で行う正しい方法です。
variable = d.get("the key", "something")
彼が指摘しているように、デフォルト値の評価を短絡することはできません。あなたは通常気にしません。デフォルト値は ですが"something"
、そうではありません。デフォルトが危険であるか、生成するのに非常にコストがかかるかどうかだけが重要です。
その場合にのみ、アイデアを使用することができ、使用する必要があります。in
代わりに必要なことを除いてhas_key
(より読みやすく、高速で、廃止されていないため):
variable = d["the key"] if "the key" in d else expensiveComputation()
if
ただし、三項式の代わりにステートメントを使用することはおそらく価値がexpensiveComputation
あります。
if "the_key" in d:
variable = d["the key"]
else:
variable = expensiveComputation()
デフォルトのケースがまれであると予想される場合、これはより良いです:
try:
variable = d["the key"]
except KeyError:
variable = expensiveComputation()
何らかの理由でキーを 2 回検索するのを避ける必要があり、例外も処理できず、デフォルトを一度に短絡する必要がある場合:
sentinel = object()
variable = d.get(sentinel)
if variable == sentinel:
variable = expensiveComputation()
そして、はい、それをすべて関数にまとめてワンライナーにすることもできますが、ほとんどの場合、3 つのまれなことを一度に実行しているという事実を隠したくありません。
または、もちろん、次のようにすることもできます。
d = collections.defaultdict(expensiveComputation)
次に、それはただです:
variable = d["the key"]
これには、返す前にを設定d["the key"]
するという副作用があるため、後で を呼び出すと同じ値が返されます。それが適切だと思われる場合は、これが最良の答えです。同じキーを 2 回使用することがない場合、またはこれらのキーが巨大であり、維持するのが無駄であるなどの場合、これは悪い考えです。expensiveComputation()
d["the key"]
dict.__missing__
または、代わりに、以下を使用する代わりにメソッドをオーバーライドできますdefaultdict
。
class MyDict(dict):
def __missing__(self, key):
return expensiveComputation()
次に、繰り返しますが、次のとおりです。
variable = d["the key"]
これは、値を毎回個別に生成し、後で保持したくない場合に適しています。