Se non séparé gli argomenti dal callable, non credo che sia possibile. Tuttavia, questo dovrebbe funzionare:
class MySettingsDict(dict):
def __getitem__(self, item):
function, arg = dict.__getitem__(self, item)
return function(arg)
def expensive_to_compute(arg):
return arg * 3
E ora:
>>> settings = MySettingsDict({
'expensive1': (expensive_to_compute, 1),
'expensive2': (expensive_to_compute, 2),
})
>>> settings['expensive1']
3
>>> settings['expensive2']
6
Edit:
Si consiglia inoltre di memorizzare nella cache i risultati di expensive_to_compute
, se si vuole essere letta più volte. Qualcosa di simile
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
E ora:
>>> 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])
Si potrebbe anche voler ignorare altri dict
metodi a seconda di come si desidera utilizzare il dict.
il problema è che se si mantiene il modulo come è, le impostazioni di 'da MySettings importano 'valuta il contenuto del modulo e quindi crea completamente il comando. – njzk2