我想编写既惰性又可链接的函数。最好的方法是什么。
我知道一种方法是执行 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/