2017-04-10 56 views
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)

最後,這裏是我的問題:)

  1. 請問這個東西有一個特殊的名字嗎?建議評論:pipe,compose_right(連同compose_left)。
  2. 與傳統功能組合相比,有哪些優缺點?

p.s.我相信這個問題適用於任何具有高階函數的語言,而不僅僅是python。

+1

請參閱http://stackoverflow.com/questions/28252585/functional-pipes-in-python-like-from-dplyr – kennytm

+1

''''環運算符從右到左評估,請參閱[函數組合]( https://en.wikipedia.org/wiki/Function_composition)。如果你完全寫出來,你會得到'set_type(set_is_positive(init(x)))',所以'set_type'set_is_positive'init'似乎沒有出錯。 – AChampion

+1

對於compose(init,set_is_positive,set_type),我通常可以看到'compose_left'爲'compose(set_type,set_is_positive,init)'和'compose_right''。 –

回答

0

因此,我們似乎對此沒有更多意見。

只是概括地說:

  1. 提出的名字是pipecompose_right(與compose_left一起)
  2. 不要在這裏多。這看起來像是個人品味和特殊情況的問題。 compose_left更像數學中的函數組合,而compose_right可能被認爲更具可讀性,因爲函數按照所應用的順序列出。

標記爲答案,直到有人想要更詳細。