0
假設我們有一個像這些一堆功能:反相功能組合物(不僅)
def init(value):
return {'number': value}
def set_type(value):
if isinstance(value['number'], float):
value['type'] = 'float'
else:
value['type'] = 'integer'
return value
def set_is_positive(value):
if value['number'] < 0:
value['is_positive'] = False
else:
value['is_positive'] = True
return value
和撰寫功能是這樣的:
def compose(*funcs):
def compose_2_funcs(f1, f2):
return lambda arg: f1(f2(arg))
return reduce(compose_2_funcs, funcs)
每個函數的結果被傳遞作爲下一個的論點。例如composed = compose(f, g, h); result = composed(arg)
與result = f(g(h(arg)))
相同。這使我們有:
description_builder = compose(set_type, set_is_positive, init)
description_builder(5)
# Result: {'number': 5, 'type': 'integer', 'is_positive': True}
這是很好,靈活,我喜歡用它。但有一件事困擾我。它看起來像一個有點反直覺的,其功能以相反的順序指定的(特別是對那些,誰不知道什麼是「功能成分」)
所以我可以定義一個函數是這樣的:
def compose_reversed(*funcs):
def composed(arg):
result = arg
for f in funcs:
result = f(result)
return result
return composed
它更具可讀性(恕我直言),並允許指定功能,以便他們被稱爲,所以description_builder = compose_reversed(init, set_is_positive, set_type)
。
最後,這裏是我的問題:)
- 請問這個東西有一個特殊的名字嗎?建議評論:
pipe
,compose_right
(連同compose_left
)。 - 與傳統功能組合相比,有哪些優缺點?
p.s.我相信這個問題適用於任何具有高階函數的語言,而不僅僅是python。
請參閱http://stackoverflow.com/questions/28252585/functional-pipes-in-python-like-from-dplyr – kennytm
''''環運算符從右到左評估,請參閱[函數組合]( https://en.wikipedia.org/wiki/Function_composition)。如果你完全寫出來,你會得到'set_type(set_is_positive(init(x)))',所以'set_type'set_is_positive'init'似乎沒有出錯。 – AChampion
對於compose(init,set_is_positive,set_type),我通常可以看到'compose_left'爲'compose(set_type,set_is_positive,init)'和'compose_right''。 –