如果不separe從可調用的參數,我不認爲這是可能的。然而,這應該工作:
class MySettingsDict(dict):
def __getitem__(self, item):
function, arg = dict.__getitem__(self, item)
return function(arg)
def expensive_to_compute(arg):
return arg * 3
現在:
>>> settings = MySettingsDict({
'expensive1': (expensive_to_compute, 1),
'expensive2': (expensive_to_compute, 2),
})
>>> settings['expensive1']
3
>>> settings['expensive2']
6
編輯:
您可能還需要緩存的expensive_to_compute
的結果,如果他們要多次訪問。事情是這樣的
class MySettingsDict(dict):
def __getitem__(self, item):
value = dict.__getitem__(self, item)
if not isinstance(value, int):
function, arg = value
value = function(arg)
dict.__setitem__(self, item, value)
return value
現在:
>>> settings.values()
dict_values([(<function expensive_to_compute at 0x9b0a62c>, 2),
(<function expensive_to_compute at 0x9b0a62c>, 1)])
>>> settings['expensive1']
3
>>> settings.values()
dict_values([(<function expensive_to_compute at 0x9b0a62c>, 2), 3])
您可能還需要重寫其他dict
方法取決於你想如何使用字典。
的問題是,如果你把你的模塊是,在'從mysettings導入設置'評估模塊的內容,因此完全創建字典。 – njzk2