2010-06-16 52 views
2

我想编写懒惰和可链接的函数。什么是最好的方法。 我知道一种方法是做yield而不是return如何在python中编写可链接的惰性函数?

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

+3

你能举个例子吗? – 2010-06-16 02:46:35

回答

5

发生器(函数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)。

+0

可以单独使用类似的功能,而不使用类? – roopesh 2010-06-16 21:05:55

+1

@roopesh,每个函数调用都必须返回一个_some_类型的对象,该对象允许“链接”,即调用更多的任意方法:你有什么内建类型可以让你调用任意方法实例?没有 - 每个内置类型都有一组明确定义的方法,当然,您不能调用其实例以外的方法。所以,显然**有**是一个用户编码类型......这也被称为“一类”。 “可链接”约束显然是这一点的主要决定因素 - 无论您设定它的原因如何。 – 2010-06-16 21:19:00

相关问题