dict
短期キャッシュとして使用します。辞書から値を取得したいのですが、辞書にそのキーがまだない場合は、次のように設定します。
val = cache.get('the-key', calculate_value('the-key'))
cache['the-key'] = val
'the-key'
がすでに にある場合cache
、2 行目は必要ありません。これについて、より短く、より表現力豊かなイディオムはありますか?
dict
短期キャッシュとして使用します。辞書から値を取得したいのですが、辞書にそのキーがまだない場合は、次のように設定します。
val = cache.get('the-key', calculate_value('the-key'))
cache['the-key'] = val
'the-key'
がすでに にある場合cache
、2 行目は必要ありません。これについて、より短く、より表現力豊かなイディオムはありますか?
はい、次を使用します。
val = cache.setdefault('the-key', calculate_value('the-key'))
シェルでの例:
>>> cache = {'a': 1, 'b': 2}
>>> cache.setdefault('a', 0)
1
>>> cache.setdefault('b', 0)
2
>>> cache.setdefault('c', 0)
0
>>> cache
{'a': 1, 'c': 0, 'b': 2}
参照: http://docs.python.org/release/2.5.2/lib/typesmapping.html
読みやすさ重視!
if 'the-key' not in cache:
cache['the-key'] = calculate_value('the-key')
val = cache['the-key']
あなたが本当にワンライナーを好むなら:
val = cache['the-key'] if 'the-key' in cache else cache.setdefault('the-key', calculate_value('the-key'))
__missing__
別のオプションは、キャッシュ クラスで定義することです。
class Cache(dict):
def __missing__(self, key):
return self.setdefault(key, calculate_value(key))
Python Decorator Library、具体的にはキャッシュとして機能するMemoizeを見てください。そうすればcalculate_value
、Memoize デコレータを使用して呼び出しを装飾することができます。
でアプローチ
cache.setdefault('the-key',calculate_value('the-key'))
calculate_value
都度評価されるので、コストがかからないのがいいですね。したがって、DB から読み取る必要がある場合、ファイルまたはネットワーク接続を開くか、「高価な」ことを行う必要がある場合は、次の構造を使用します。
try:
val = cache['the-key']
except KeyError:
val = calculate_value('the-key')
cache['the-key'] = val
defaultdictを使用して同様のことを行うこともできます。
>>> from collections import defaultdict
>>> d = defaultdict(int) # will default values to 0
>>> d["a"] = 1
>>> d["a"]
1
>>> d["b"]
0
>>>
独自のファクトリ関数と itertools.repeatを指定することで、任意のデフォルトを割り当てることができます。
>>> from itertools import repeat
>>> def constant_factory(value):
... return repeat(value).next
...
>>> default_value = "default"
>>> d = defaultdict(constant_factory(default_value))
>>> d["a"]
'default'
>>> d["b"] = 5
>>> d["b"]
5
>>> d.keys()
['a', 'b']
(ページ全体)「Code Like a Pythonista」http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#dictionary-get-methodをご覧ください。
上記の setdefault() テクニックをカバーしており、defaultdictテクニックは、たとえばセットや配列の辞書を作成するのにも非常に便利です。
使用setdefault
方法、
キーがまだ存在しない場合は、2 番目の引数で指定された値をsetdefault
使用して新しいキーを作成しvalue
ます。キーが既に存在する場合は、そのキーの値を返します。
val = cache.setdefault('the-key',value)