2015-09-21 131 views
1

我想寫一個函數,獲取作爲參數的函數列表和第一個參數。然後按順序調用它們,將前一個的輸出傳遞給下一個。 (很明顯,爲了這個工作,所有的函數必須要有相同數量的參數並返回相同數量的值)。如何將函數的輸出傳遞給另一個函數作爲輸入?

這裏是我的嘗試:

def chain(functions, *first_func_params): 
    params = first_func_params 
    for func in functions: 
     params = func(*params) 

但是這隻有當所有函數返回元組(「多值」)或其他序列類型,因爲只有序列類型可以解壓到的參數列表功能。

如果函數只返回單個值,則chain不起作用。

可能只是檢查func的輸出是否是一個元組,並相應地採取行動。但是,有沒有更優雅的解決方案?

你將如何實現這一點?

+1

我想我的建議是不寫這個函數:-)。有太多的角落案例可能會讓人非常驚訝。例如你傳遞'[foo,bar]','foo'返回一個'namedtuple'('bar'作爲輸入) - 不幸的是,管道失敗了,因爲你的函數組合決定在應該剛剛通過的時候_unpack namedvalue_通過論證。 – mgilson

+0

你可以讓你的函數期望單個元組作爲輸入'f(t)',這樣它就可以手動解包像'a,b,c = t'這樣的參數嗎?那麼在任何情況下返回值也應該是一個元組(例如'return(True,)')。這樣不需要特殊情況 – Pynchia

回答

1

你可以使用:

if not isinstance(params, tuple): 
    params = (params,) 

或乘坐TypeError異常,如果您嘗試一個unpackable對象之前使用*將得到提升。

+0

我可以做到這一點。但是,有沒有更優雅的解決方案? –

+0

@AvivCohn對我來說,這是優雅的,恐怕我想不出另一種辦法...... – cdonts

相關問題