我想编写懒惰和可链接的函数。什么是最好的方法。 我知道一种方法是做yield
而不是return
。如何在python中编写可链接的惰性函数?
我希望这些函数是懒惰的,就像当sqlalchemy函数被要求从数据库中获取数据时一样懒。
我想编写懒惰和可链接的函数。什么是最好的方法。 我知道一种方法是做yield
而不是return
。如何在python中编写可链接的惰性函数?
我希望这些函数是懒惰的,就像当sqlalchemy函数被要求从数据库中获取数据时一样懒。
发生器(函数yield
而不是return
)确实可以看作是“懒惰”(并且itertools.chain
可以像其他任何迭代器那样链接它们,如果这就是“可链接”的意思)。但如果通过“可链接”(和懒惰),你的意思是你想调用fee().fie().fo().fum()
并且所有的“努力工作”只发生在fum
(这看起来更接近于SQLAlchemy的做法),那么生成器将不会帮助 - - 您需要的是“Promise”设计模式,其中每个函数/方法(除了实际执行所有工作的函数/方法)返回一个对象,该对象记录操作上的所有条件,参数和约束条件,以及勤劳功能使用这些信息来最终完成工作。
举一个非常简单的例子,说“艰苦的工作”是执行形式为remote(host, **kwargs)
的RPC调用。你可以在“偷懒可链接服装”打扮这件事如下:
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
)。
可以单独使用类似的功能,而不使用类? – roopesh 2010-06-16 21:05:55
@roopesh,每个函数调用都必须返回一个_some_类型的对象,该对象允许“链接”,即调用更多的任意方法:你有什么内建类型可以让你调用任意方法实例?没有 - 每个内置类型都有一组明确定义的方法,当然,您不能调用其实例以外的方法。所以,显然**有**是一个用户编码类型......这也被称为“一类”。 “可链接”约束显然是这一点的主要决定因素 - 无论您设定它的原因如何。 – 2010-06-16 21:19:00
你能举个例子吗? – 2010-06-16 02:46:35