字典值的惰性评估?

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发电机吗?

don*_*ode 6

带 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)