And*_*unt 3 python lazy-evaluation python-3.x
假设我有以下 dict d={'a': heavy_expression1, 'b': heavy_expression2}
。
如何包装表达式,以便在访问它们后对其进行求值,并且在此之后不执行求值?
d['a'] # only here heavy_expression1 is executed
d['a'] # no execution here, already calculated
Run Code Online (Sandbox Code Playgroud)
我需要使用lambda
发电机吗?
带 lambda 的版本:
class LazyDict(dict):
def __init__(self, lazies):
self.lazies = lazies
def __missing__(self, key):
value = self[key] = self.lazies[key]()
return value
d = LazyDict({'a': lambda: print('heavy_expression1') or 1,
'b': lambda: print('heavy_expression2') or 2})
print(d['a'])
print(d['a'])
print(d['b'])
print(d['b'])
Run Code Online (Sandbox Code Playgroud)
输出:
heavy_expression1
1
1
heavy_expression2
2
2
Run Code Online (Sandbox Code Playgroud)