我想編寫懶惰和可鏈接的函數。什麼是最好的方法。 我知道一種方法是做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