roo*_*esh 2 python lazy-evaluation
我想编写懒惰和可链接的函数.什么是最好的方式.我知道一种方法是做yield
而不是做return
.
我希望这些函数是懒惰的,类似于sqlalchemy函数在被要求从DB中获取数据时的延迟方式.
生成器(yield
代替的函数return
)确实可以被视为"懒惰"(并且itertools.chain
可以将它们链接到任何其他迭代器,如果这是"可链接"的意思).
但是,如果通过"可链接"(和懒惰)你的意思是你想要打电话fee().fie().fo().fum()
并让所有"辛勤工作"只发生在fum
(这似乎更接近SQLAlchemy所做的),那么发电机将无济于事 - 你需要什么,而不是,是"Promise"设计模式,其中每个函数/方法(实际完成所有工作的除外)返回一个对象,该对象记录操作的所有条件,参数和约束,而一个勤奋的函数使用该模式最终完成工作的信息.
举一个非常简单的例子,假设"辛勤工作"正在执行表单的RPC调用remote(host, **kwargs)
.你可以用"懒人链式服装"装扮如下:
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
Run Code Online (Sandbox Code Playgroud)
现在,RPC(x).foo('bar').baz('bap').doit()
调用remote(x, foo=bar, baz=bap)
(当然你可以保存链的中间阶段,作为参数传递它们等等,直到调用doit
).