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.__getitem__()
方法,dict.get()
也不会如预期的那样工作。在正确的方法是从
collections
继承abc.Mapping
。在然后您可以:
^{pr2}$我还列出了示例代码和示例:https://gist.github.com/gyli/9b50bb8537069b4e154fec41a4b5995a
如果你不把论点和可调用的分开,我认为这是不可能的。但是,这应该是有效的:
现在:
^{pr2}$编辑:
如果要多次访问
expensive_to_compute
的结果,则可能还需要缓存这些结果。像这样的东西现在:
根据您希望如何使用dict,您可能还希望重写其他
dict
方法将对函数的引用存储为键的值,即:
这样,只有在访问并调用与键相关联的函数时,才能计算它。可以处理非延迟值的合适类是:
^{pr2}$用法:
相关问题 更多 >
编程相关推荐