2012-09-22 84 views
0

我已經定義了一個類,該類以[fname1,[parameters1],fname2,[parameters2] ...]形式的列表作爲參數創建一個實例。Python:將函數名和參數列表傳遞給類實例

這個想法是讓實例一次執行列表中的所有函數,並將它們各自的參數傳遞給它們 - 它工作得很好,但是我實現的實現非常難看。 它看起來是這樣的:

# (The input list is split up and transformed into two lists - 
# one containing the function names as strings, the other one containing tuples) 
# (It then runs a for-loop containing the following statement) 

exec '%s%s'%(fname[i],repr(parameter_tuple[i])) 

,輸出和運行 'FNAME(參數,more_parameters,和,因此,上)',就像它應該做的。

我不知道爲什麼,但因爲我這個編碼,因此我得到我應該得到一個很好的跳動它的想法......雖然它的作品,我只是知道必須有一個不太難看實現。 任何人都願意幫我看看嗎?或者也許打我一點? ;-)

回答

4

這裏最簡單的答案,如果你能做到這一點,是簡單地傳遞函數,而不是函數名稱,然後做一個簡單:

for function, params in zip(functions, parameters): 
    function(*params) 

注意我用的zip()循環一次超過兩個列表。這是比循環索引更多的Pythonic選項。

或者,或者使用itertools.starmap()

如果您確實無法直接傳遞函數,則會變得更加困難。首先,依賴於變量名稱的任何解決方案本身都是脆弱的,所以最好的選擇是從函數名稱到函數創建一個明確的字典,然後查找函數。

否則,我會建議使用inspect模塊來找到你想要的功能。 E.g:

import inspect 
import sys 

def some_function(): 
     ... 

print(dict(inspect.getmembers(sys.modules[__name__], inspect.isfunction))) 

產地:

{'some_function': <function some_function at 0x7faec13005a0>} 

但是請注意,這是遠不如高效,更迂迴。最好的答案仍然是通過函數本身。

+0

非常好!我還不知道壓縮功能。非常感謝分享。 :) – irrenhaus3

0

這裏是一個函數,它的功能的列表(未函數名)和參數列表(或元組)的列表:

def callmany(funs, funargs): 
    return [f(*args) for (f,args) in zip(funs, funargs)] 

它返回結果的列表,其中在所述結果的第一個元素是在funargs中用第一個參數列表調用funs中的第一個函數的結果。像這樣:

callmany([len, range], [["hello"], [1, 10]]) 
>> [5, [1, 2, 3, 4, 5, 6, 7, 8, 9]] 
+0

這已經在標準庫中。請參閱[''itertools.starmap''](http://docs.python.org/library/itertools.html#itertools.starmap)。沒有意義重新實現它(效率較低)。 –

+0

我剛剛從另一個答案中瞭解到:-) – dkagedal

相關問題