2012-07-17 42 views
1

我有一個Python腳本,它創建了自己的函數的字典,我希望它通過使用YARP讀取函數名稱和參數來執行它們(YARP的知識與這個問題雖然)。使用檢查將參數傳遞給Python中的函數

我創建了一個名爲「inc」的字符串列表,該字符串由進入程序的值填充。第一個項目是一個函數名稱,列表中的任何其他字符串都是參數。我創建了一個名爲「methods」的字典,其中鍵是函數名,值是對函數對象的引用(使用inspect模塊)。我將函數的返回值存儲在變量「result」中。

下面的代碼片段顯示了我目前使用的簡化版本,它工作正常,但不能處理具有多個參數的函數。爲了規避這一點,我用一個列表,如果函數需要更多參數:

if len(inc) == 1: 
    result = methods[inc[0]]() # call method with 0 arguments 

elif len(inc) == 2: 
    result = methods[inc[0]](inc[1]) # call method passing a string 

else: 
    args = [] 
    result = methods(inc[0])(inc[1:]) # call method passing a list 

理想情況下,我想改變這種做法,我的函數可以有任意數量的參數,但我無法弄清楚如何我可以做到這一點。我是Python的新手,我查看了文檔和各種網站 - 我找不到解決方案。我嘗試過創建參數元組,但是這不起作用,因爲它最終將整個元組作爲一個參數傳遞。

有沒有比這個問題更好的解決方案,比如創建一些代表一組參數的對象並將其傳遞給函數?任何建議將不勝感激!

回答

1

你應該看看https://stackoverflow.com/a/3394898/1395668

你要找的魔法就是*。應用此列表然後解壓縮的項目到你的函數的參數字段:

a = [ 1, 2, 3] 
def myfunc(a, b, c): 
    return a + b + c 

print myfunc(*a) 

退房**爲字典

+0

完美,非常感謝! – MxB 2012-07-17 10:35:12

0

這是一個有點奇怪有這種混合結構:

inc = [func_name, arg1, arg2, ...] 

那豈不是更自然有單獨比特的信息?

func_name = ... 
args = [arg1, arg2, ...] 

的,你可以做

methods[func_name](*args) 

(通常情況下,我不會的功能名稱綁定到一個變量,但最好功能本身。)

+0

前一種方法看起來像口齒不清給我同樣的做法 - 並沒有什麼錯接着就,隨即。 – 2012-07-17 10:35:30

+0

這很奇怪,並不完全是我的程序中的結構 - 我只是爲了簡化示例而放置了一個列表。實際的程序使用YARP使用的「Bottle」對象。 – MxB 2012-07-17 10:36:28

+0

另外,謝謝你的回覆,因爲*是我失蹤的! :-) – MxB 2012-07-17 10:36:57