Python 延迟求值器

10 投票
8 回答
11612 浏览
提问于 2025-04-16 13:38

有没有一种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

撰写回答