2010-06-16 68 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

相關問題