24

モジュールレベルで定義されたこの辞書がPythonにあるとしましょう(mysettings.py):

settings = {
    'expensive1' : expensive_to_compute(1),
    'expensive2' : expensive_to_compute(2),
    ...
}

キーにアクセスしたときにこれらの値を計算したいと思います。

from mysettings import settings # settings is only "prepared"

print settings['expensive1'] # Now the value is really computed.

これは可能ですか?どのように?

4

8 に答える 8

4

関数への参照をキーの値として保存します。

def A():
    return "that took ages"
def B():
    return "that took for-ever"
settings = {
    "A": A,
    "B": B,
}

print(settings["A"]())

この方法では、キーにアクセスして呼び出すときに、キーに関連付けられた関数のみを評価します。非遅延値を処理できる適切なクラスは次のとおりです。

import types
class LazyDict(dict):
    def __getitem__(self,key):
        item = dict.__getitem__(self,key)
        if isinstance(item,types.FunctionType):
            return item()
        else:
            return item

利用方法:

settings = LazyDict([("A",A),("B",B)])
print(settings["A"])
>>> 
that took ages
于 2013-05-21T12:04:54.870 に答える