Python 延迟求值器
有没有一种Python的写法,可以让一个懒惰的函数调用在第一次使用时,调用一个之前绑定的函数g(Z)
,而在后续的调用中,f()
则返回一个缓存的值呢?
需要注意的是,记忆化(memoization)可能不是最合适的解决方案。
我有:
f = g(Z)
if x:
return 5
elif y:
return f
elif z:
return h(f)
这段代码可以运行,但我想重新组织一下,让g(Z)
只有在值被使用的时候才被调用。我不想改变g(...)
的定义,而且Z
的大小不太适合缓存。
补充说明:我原以为f
必须是一个函数,但可能并不是这样。
8 个回答
2
你有没有想过在这种情况下为什么不直接用一个lambda表达式呢?
f = lambda: g(z)
if x:
return 5
if y:
return f()
if z:
return h(f())
3
试试这个装饰器:
class Memoize:
def __init__ (self, f):
self.f = f
self.mem = {}
def __call__ (self, *args, **kwargs):
if (args, str(kwargs)) in self.mem:
return self.mem[args, str(kwargs)]
else:
tmp = self.f(*args, **kwargs)
self.mem[args, str(kwargs)] = tmp
return tmp
(摘自一个已失效的链接:http://snippets.dzone.com/posts/show/4840 / https://web.archive.org/web/20081026130601/http://snippets.dzone.com/posts/show/4840)
(在这里找到的:有没有简单缓存函数返回值的装饰器? 作者:Alex Martelli)
编辑:这里还有另一种形式的属性(使用 __get__
) http://code.activestate.com/recipes/363602/
8
我有点搞不清楚你是想要缓存还是懒惰计算。如果你是想要懒惰计算,可以看看这个模块:Alberto Bertogli 的 lazy.py。