12

dict短期キャッシュとして使用します。辞書から値を取得したいのですが、辞書にそのキーがまだない場合は、次のように設定します。

val = cache.get('the-key', calculate_value('the-key'))
cache['the-key'] = val

'the-key'がすでに にある場合cache、2 行目は必要ありません。これについて、より短く、より表現力豊かなイディオムはありますか?

4

8 に答える 8

22

はい、次を使用します。

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

于 2012-06-22T08:21:51.613 に答える
19

読みやすさ重視!

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))
于 2012-06-22T08:58:09.823 に答える
5

Python Decorator Library、具体的にはキャッシュとして機能するMemoizeを見てください。そうすればcalculate_value、Memoize デコレータを使用して呼び出しを装飾することができます。

于 2012-06-22T08:22:02.477 に答える
4

でアプローチ

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
于 2012-06-22T08:35:45.620 に答える
2

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']
于 2012-06-22T08:46:11.407 に答える
2

(ページ全体)「Code Like a Pythonista」http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#dictionary-get-methodをご覧ください。

上記の setdefault() テクニックをカバーしており、defaultdictテクニックは、たとえばセットや配列の辞書を作成するのにも非常に便利です。

于 2012-06-22T08:34:15.060 に答える
1

使用setdefault方法、

キーがまだ存在しない場合は、2 番目の引数で指定された値をsetdefault使用して新しいキーを作成しvalueます。キーが既に存在する場合は、そのキーの値を返します。

val = cache.setdefault('the-key',value)
于 2012-06-22T08:22:30.567 に答える