python - 如何在 python 中编写可链接的惰性函数?

标签 python lazy-evaluation

我想编写既惰性又可链接的函数。最好的方法是什么。 我知道一种方法是执行 yield 而不是 return

我希望这些函数是惰性的,就像 sqlalchemy 函数在被要求从数据库中获取数据时是惰性的。

最佳答案

生成器(使用 yield 而不是 return 的函数)确实可以被视为“惰性”(并且 itertools.chain 可以将它们链接起来以及任何其他迭代器,如果这就是“可链接”的意思)。

但是,如果通过“可链接”(和惰性)你的意思是你想调用 fee().fie().fo().fum() 并让所有的“艰苦工作”发生仅在 fum 中(这似乎更接近于 SQLAlchemy 所做的),那么生成器将无济于事——您需要的是“Promise”设计模式,其中每个函数/方法(除了一个实际完成所有工作的人)返回一个对象,该对象记录了操作的所有条件、参数和约束,并且一个努力工作的函数使用该信息最终执行工作。

举一个非常简单的例子,假设“艰苦的工作”是执行 remote(host, **kwargs) 形式的 RPC 调用。你可以像下面这样用“lazy chainable clothing”来打扮它:

class RPC(object):
    def __init__(self, host):
        self._host = host
        self._kws = {}
    def doit(self, **morekws):
        return remote(self._host, **dict(self._kws, **morekws))
    def __getattr__(self, name):
        def setkw(value):
            self._kws[name] = value
            return self
        return setkw

现在,RPC(x).foo('bar').baz('bap').doit() 调用 remote(x, foo=bar, baz=bap) (当然,您可以保存链的中间阶段,将它们作为参数等传递,直到调用 doit)。

关于python - 如何在 python 中编写可链接的惰性函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3050411/

相关文章:

c# - LINQ IQueryable 检查是否为空而不枚举

Scala lazy val解释

numpy - numpy.einsum 的惰性求值以避免在内存中存储中间大维数组

haskell - 此列表如何理解其自身的单位?

python - 如何在 Spyder(Anaconda 3) 上安装 PIL?

python - 类型错误 : 'str' object is not an iterator when concatenating csv files

python - sqlite + PyQt5 到独立 exe - Python 3.6.3 + Pyinstaller

字典的 python boolean 键

Python - cPickle 嵌套日期时间对象

haskell - 从 State 切换到 StateT 后,如何恢复单子(monad)构造列表的惰性求值?