2011-11-08 23 views
2

我有一個函數:傳遞不同數量的參數成函數

def save(self, text, *index): 
    file.write(text + '\nResults:\n') 
    if index ==(): index = (range(len(self.drinkList))) 
    for x in index: 
     for y in self.drinkList[x].ing: 
      file.write('min: ' + str(y.min) + ' max: ' + str(y.max) + ' value: ' + str(y.perc) + '\n') 
     file.write('\n\n') 
    file.write('\nPopulation fitness: ' + str(self.calculatePopulationFitness()) + '\n\n----------------------------------------------\n\n') 

現在,當我通過一個參數爲指標,因爲它應該是功能的作品,但是當我通過的2個索引元組我得到一個TypeError:列表索引必須是整數,而不是元組。我應該改變什麼?

+2

你能告訴你如何調用該函數? – rossipedia

+0

自我。save('Resulted in',(index1,index2)) self.save('Resulted in',index) 第一次調用給出了一個錯誤,當我通過它而沒有生成一個元組時,結果文件是空的。 – kyooryu

回答

5

save(self, text, *index)語法表示index is itself a tuple所有參數傳遞給save之後的text之一。

所以,舉例來說,如果你在你的代碼有:

myobject.save("sample text", 1, 2, 3) 

然後index將是元組(1, 2, 3)for x in index能正確遍歷值123

在另一方面,如果你哈維爾

myobject.save("sample text", (1,2)) 

然後index將是1元的元組((1,2),)x在 循環將得到價值(1,2),因此TypeError

0

而不是調用你的方法與指標的像

x.save("ababs",(0,1)) 

一個元組剛剛與指數稱它爲一個又一個,好像他們是不同的PARAMATERS的方法

x.save("ababs",0,1) 
1

隨着中*索引定義,你必須調用函數save(self, text, index1, index2),而index將是一個元組,(index1, index2)。如果在參數text之後將元組傳遞給save,則可以將*取出。

3

這取決於您實際嘗試通過的參數。我推測你稱之爲:

object.save("hello world", (3, 4, 5)) 

當您使用*運算符時,不需要將可變數量的參數作爲元組傳遞。相反,在固定參數之後傳遞的所有內容都被包裝到一個列表中。因此,在這種情況下,變量index指的是[(3, 4, 5)],而不是[3, 4, 5]

你應該調用的函數save這樣,而不是:

object.save("hello world", 3, 4, 5) 

變量index現指[3, 4, 5]

如果由於某種原因,你想還是通過一個元組,只要你的函數定義修改爲:

def save(self, text, index): # Observe the lack of '*' 
+0

請注意,如果您希望繼續允許傳遞一個參數,則此替代可能與'def save(self,text,index =())'類似。 –