Jeśli nie Separe argumenty od wymagalne, nie sądzę, że to możliwe. Jednak powinno to działać:
class MySettingsDict(dict):
def __getitem__(self, item):
function, arg = dict.__getitem__(self, item)
return function(arg)
def expensive_to_compute(arg):
return arg * 3
a teraz:
>>> settings = MySettingsDict({
'expensive1': (expensive_to_compute, 1),
'expensive2': (expensive_to_compute, 2),
})
>>> settings['expensive1']
3
>>> settings['expensive2']
6
Edit:
Możesz także buforować wyniki expensive_to_compute
, jeśli mają być dostępne wielokrotnie. Coś takiego
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
A teraz:
>>> 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])
Można też zastąpić inne metody w zależności od dict
jak chcesz użyć dict.
problemem jest to, że jeśli trzymać moduł, jak to, że 'z mysettings importować ustawienia 'ocenia zawartość modułu, a zatem w pełni tworzy dict. – njzk2