[Python] problème avec les threads

Résolu/Fermé
Utilisateur anonyme - 6 oct. 2011 à 18:47
 Utilisateur anonyme - 7 oct. 2011 à 01:09
Bonjour, sous python j'utilise un thread qui appel une fonction qui demande 1 seul arguments.

Dans mon thread j'envoi un argument d'un ID d'une boucle que je transforme en str :

....args=(str(i))....

Le problème c'est que quand i passe à 10, je ne c'est pour quel raison j'ai une erreur type :
La fonction accepte qu'un seul argument (2 given)

Sous entendu que si i à deux chiffres ça envoi deux arguments TT

Vous avez une solution ?

Merci d'avance.






4 réponses

heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 oct. 2011 à 21:49
Bonsoir,

Il se peut que ce soit dû au fait que l'exécution utilise une méthode d'une instance d'une classe que tu as définie toi même

L'appel d'une méthode déclenche en fait l'appel d'une fonction attachée à l' instance concernée, et qui est traitée d'une façon particulière par l'interpréteur:
quand une méthode est appelée, la fonction associée reçoit automatiquement l'identité de l'instance qui comporte la méthode / fonction en question.
L'identité, c'est donné par la fonction id() si on veut la connaître, mais peu importe le but n'est pas de savoiir ce qui est passé comme premier argument à la fonction, c'est de savoir qu'elle reçoit TOUJOURS une donnée l'informant de quelle est l'instance concernée, même quand on ne met pas d'argument dans l'appel de la méthode



Nota bene:

il faut bien distinguer la méthode:

a.met(x,12,'bu') ici on passe 3 arguments à la méthode de l'instance a
et la fonction associée:

func(info sur l'instance, x, 12, 'bu' ) ici 4 arguments puisque le premier est automatiquement fourni à la fonction




Le premier argument est reçu par le premier paramètre de la définition de la méthode (ou plutôt de la fonction) , celui qu'on appelle de façon conventionnelle self lorsqu'on définit une classe

Enfin , tout ça pour dire qu'il arrive qu'on utilise maintes fois une méthode sans lui passer d'objet en argument, ignorant que par dessous la fonction va recevoir une info sur l'instance en première position , tout le temps.

Et puis un beau jour, on utilise la méthode avec un argument alors qu'on ne devrait pas, et au lieu d'avoir un message d'erreur disant qu'il y a 1 argument de trop, on découvre celui qui tu as obtenu, avertissant que la fonction reçoit deux arguments et on se demande quel autre.


La tournure du message d'erreur que tu rapportes me fait fortement penser à cette explication.

Si ce n'est pas ça, il faudrait fournir plus de code pour qu'on puisse chercher quelle autre raison peut exister pour ton programme
0
Utilisateur anonyme
6 oct. 2011 à 22:36
La raison est qu'il faut envoyer un tuple ou une liste comme argument au thread

donc le rajoute d'une virgule après str(i) fait que tous fonctionne bien.

threading.Thread(target=IdentificationClient, args=(str(i),)).start()

et non :

threading.Thread(target=IdentificationClient, args=(str(i))).start()
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
6 oct. 2011 à 22:59
ah OK
et bien en effet, il suffisait de mieux lire ta question pour comprendre de quoi il retournait
str(10) est en effet une chaîne comportant deux éléments, et les praenthèses autour ne changent rien, (str(10)) est toujours la même chaîne je lirai mieux les questions à partir de maintenant
0
Utilisateur anonyme
7 oct. 2011 à 01:09
Merci quand même d'avoir pris le temps de répondre à ma question.
0