Variable non global, qui agit comme une global...

Résolu
MickaToast Messages postés 162 Statut Membre -  
MickaToast Messages postés 162 Statut Membre -
Bonsoir!

Voilà mon problème: J'ai codé un bot IRC qui parle et interagit avec les utilisateurs. Maintenant, j'ai regardé tout l'ensemble du code pour commenter peu à peu et je viens de remarquer qu'une variable agissait en tant que variable globale. Voici le code:

CHANNEL = "#Micka"

def JoinChannel():
    s.send(bytes("JOIN %s\r\n" % CHANNEL, "UTF-8"))
threading.Timer(5.0, JoinChannel).start()


Une petite explication... Après 5 secondes du lancement du programme, le bot se connecte via un socket en utilisant la commande JOIN. Maintenant, j'aimerais savoir pourquoi la variable CHANNEL dans la fonction JoinChannel() prend la valeur "#Micka", CHANNEL n'a jamais été déclaré comme global dans mon code..

Merci pour les réponses!

4 réponses

Sugel Messages postés 4859 Statut Membre 727
 
c'est ptet mieux si tu passe le chan à joindre en argument de la fonction, nan ^^ ?

Python est un langage interprété, il prends donc certaines libertés vis à vis de la cohérence de ton code.

En l'occurrence, tu n'as pas de variable CHANNEL déclarée à l'intérieur de ta fonction, donc python vas de la chercher dans le main.

PS: c'est fou, moi aussi je suis sur un bot IRC en C en ce moment ^^

------------------------------------------------------------------------------------
"La peur mène à la colère. La colère mène à la haine. Et la haine ... mène à la souffrance." - Yoda
0
MickaToast Messages postés 162 Statut Membre 24
 
Bonjour Sugel,

Ce que je ne comprends pas alors c'est que des fois, python me dit qu'il ne reconnait pas la variable, je dois donc la passer en global pour qu'elle puisse être utilisé dans le main et la fonction...
0
Sugel Messages postés 4859 Statut Membre 727
 
effectivement, oui.

de toute façon il est fortement déconseillé d'utiliser des variables globales, au point que tu n'aurai même pas du avoir l'occasion de poser la question :p
0
Utilisateur anonyme
 
@MickaToast,

CHANNEL est bien une variable globale et locale dans le sens où tu déclares cette variable dans la partie principale du programme qui a deux dictionnaires, un global et un local.

Tu pourras l'utiliser dans le programme principal et dans tes fonctions du programme.

Par contre tu pourras modifier cette variable que dans la partie principale du programme, non dans une fonction. Dans le cas où tu souhaites le faire il faudra utiliser un mot clé qui est global. Effectivement, comme Sugel le suggère (il pensait certainement à ce mot clé), le mot clé global n'est pas conseillé, c'est très moche dans le sens où les débutant qui l'utilisent font du bricolage avec.

Exemple avec l'écriture d'une variable globale

CHANNEL = None

def modify():
    CHANNEL = "hello"
    
modify()

print(CHANNEL) # None, CHANNEL est pas modifié 


Maintenant avec le mot clé global

CHANNEL = None

def modify():
    global CHANNEL
    CHANNEL = "hello"
    
modify()

print(CHANNEL) # Affichage de hello, CHANNEL est modifié
0
MickaToast Messages postés 162 Statut Membre 24
 
Ah je comprend mieux à quoi sert global du coup (oui, le débutant qui fait du bricolage c'était bien moi :D), mais du coup merci de m'avoir éclairé sur le fonctionnement du mot clé global!

Merci à vous deux et bonne soirée.
0