2011-11-08 25 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 =())'类似。 –