2 votes

Passage d'un nombre différent d'arguments dans une fonction

J'ai une fonction :

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')

Maintenant, lorsque je passe un argument en tant qu'indice, la fonction fonctionne comme elle est censée le faire, mais lorsque je passe un tuple de 2 indices, j'obtiens un TypeError : list indices must be integers, not tuple. Que dois-je changer ?

5voto

Riccardo Murri Points 694

El save(self, text, *index) La syntaxe signifie que index est lui-même un tuple avec tous les arguments passés à save après le text un.

Donc, par exemple, si vous avez dans votre code :

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

puis index sera le tuple (1, 2, 3) et le for x in index bouclera correctement sur les valeurs 1 , 2 , 3 .

D'autre part, si vous avezL

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

puis index sera le tuple à 1 élément ((1,2),) et le x dans le obtiendra la valeur (1,2) d'où le TypeError .

3voto

mlefavor Points 1379

Cela dépend des paramètres que vous avez réellement essayé de passer. Je présume que vous avez appelé quelque chose du genre :

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

Lorsque vous utilisez l'opérateur *, vous n'avez pas besoin de passer le nombre variable d'arguments sous forme de tuple. Au lieu de cela, tout ce que vous passez après les arguments fixes est regroupé dans une liste. Par conséquent, dans ce cas, la variable index se réfère à [(3, 4, 5)] pas [3, 4, 5] .

Vous devez appeler la fonction save comme ceci à la place :

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

La variable index fait désormais référence à [3, 4, 5] .

Si, pour une raison ou une autre, vous souhaitiez continuer à transmettre un tuple, il vous suffirait de modifier la définition de votre fonction en :

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

1voto

crippledlambda Points 8422

Avec la définition *index, vous devez appeler la fonction comme suit save(self, text, index1, index2) y index sera un tuple, (index1, index2) . Si vous passez un tuple à save après l'argument, text vous pouvez laisser le * dehors.

0voto

MAK Points 12571

Au lieu d'appeler votre méthode avec un tuple d'indices comme

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

Il suffit de l'appeler avec les indices l'un après l'autre comme s'il s'agissait de paramètres distincts de la méthode.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X