Если вы не 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
Edit:
Вы также можете кэшировать результаты 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
методы в зависимости от того, как вы хотите использовать Dict.
проблема заключается в том, что если вы держите ваш модуль, как есть, 'от MySettings импортировать настройки 'оценивает содержимое модуля и поэтому полностью создает dict. – njzk2