Variables globales et modules
Résolu/Fermé
pols12
Messages postés
1143
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
31 juillet 2019
-
1 mai 2014 à 19:47
pols12 Messages postés 1143 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 31 juillet 2019 - 9 mai 2014 à 23:31
pols12 Messages postés 1143 Date d'inscription lundi 22 mars 2010 Statut Membre Dernière intervention 31 juillet 2019 - 9 mai 2014 à 23:31
6 réponses
pols12
Messages postés
1143
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
31 juillet 2019
119
9 mai 2014 à 00:35
9 mai 2014 à 00:35
Merci de ton aide.
Je vais essayer d'expliquer un peu mieux.
En fait on a un programme en fenêtre réalisé avec PyGame.
mod1.py
mod2.py
En fait, Je voudrais réinitialiser un des trois éléments de ordonnees en fonction des touches sur lesquelles appuie l'utilisateur.
Je crois que j'ai une idée qui pourrait me permettre de me passer des globales. Il faudra que je vois ça plus tard. Mais si tu avais une solution, ça m'éviterait peut-être de perdre du temps, et ça m'apporterait au minimum de la culture. :)
Merci à toi et à tout bonne âme qui passerait par ici avec la solution ! ;)
Je vais essayer d'expliquer un peu mieux.
En fait on a un programme en fenêtre réalisé avec PyGame.
mod1.py
from mod2 import * ordonnees=[610,610,610] #on initialise la variable globale ordonnees while 1==1 :#boucle infinie pour garder la fenêtre ouverte if evenement.key == K_q : #si on appuie sur la touche Q au clavier valider(ordonnees,1) if evenement.key == K_s : #si on appuie sur la touche S au clavier valider(ordonnees,2) ordonnees+=1
mod2.py
def valider(y,a) : if y < 700 : disparaitre(4*i+a) #où i est un compteur qui vaut 0, 1 ou 2 #4*i+a donne en fait l'index d'un des éléments de ordonnees[] def disparaitre(no_case) : #donc no_case=4*i+a et vaut 0, 1 ou 2 #on essaie ici de modifier ordonnees qui a été définie dans mod1.py global ordonnees ordonnees[no_case]=610 #mais évidemment ça ne marche pas
En fait, Je voudrais réinitialiser un des trois éléments de ordonnees en fonction des touches sur lesquelles appuie l'utilisateur.
Je crois que j'ai une idée qui pourrait me permettre de me passer des globales. Il faudra que je vois ça plus tard. Mais si tu avais une solution, ça m'éviterait peut-être de perdre du temps, et ça m'apporterait au minimum de la culture. :)
Merci à toi et à tout bonne âme qui passerait par ici avec la solution ! ;)
pols12
Messages postés
1143
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
31 juillet 2019
119
3 mai 2014 à 12:00
3 mai 2014 à 12:00
Up !
Utilisateur anonyme
3 mai 2014 à 19:08
3 mai 2014 à 19:08
Pour cela il faudrait comprendre ce que vous cherchez à faire, car malgré les explications on ne comprend pas ! Cependant si ça peut vous rassurer, l'utilisation du mot clé global est une mauvaise pratique, donc vous ne perdez pas grand chose à ce que personne ne réponde.
Bonne soirée...
Bonne soirée...
pols12
Messages postés
1143
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
31 juillet 2019
119
3 mai 2014 à 21:42
3 mai 2014 à 21:42
J'aimerais bien m'en passer, des globales. Je sais que Satan s'y cache et si j'étais seul sur le projet, je m'acharnerais à trouver une autre solution.
Seulement je ne suis pas seul sur le projet et mon coéquipier a au contraire tendance à n'utiliser que des globales. Comme je n'ai pas la solution ni le temps pour la trouver, je me résous aux globales qui sont d'utilisation enfantine.
Je ne comprends pas ce qui n'est pas compréhensible dans mon problème. J'ai du trop vouloir simplifier.
Je résume : j'ai un fichier qui contient une variable globale et qui importe un module contenant la fonction disparaitre. J'aimerais que la fonction disparaitre() puisse modifier la variable globale alors que celle ci n'est pas déclaré dans le même fichier.
Si vraiment ça n'est pas clair, je posterai plus de code la semaine prochaine. ;)
Seulement je ne suis pas seul sur le projet et mon coéquipier a au contraire tendance à n'utiliser que des globales. Comme je n'ai pas la solution ni le temps pour la trouver, je me résous aux globales qui sont d'utilisation enfantine.
Je ne comprends pas ce qui n'est pas compréhensible dans mon problème. J'ai du trop vouloir simplifier.
Je résume : j'ai un fichier qui contient une variable globale et qui importe un module contenant la fonction disparaitre. J'aimerais que la fonction disparaitre() puisse modifier la variable globale alors que celle ci n'est pas déclaré dans le même fichier.
Si vraiment ça n'est pas clair, je posterai plus de code la semaine prochaine. ;)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Utilisateur anonyme
3 mai 2014 à 22:02
3 mai 2014 à 22:02
Je ne comprend pas ce que vous voulez parce-que votre code essai ne peut pas être fonctionnel, car incohérent.
Si vous importez la fonction disparaitre du module valider.py, que vaut no_case dans main.py ? Vous avez sans doute un NameError comme erreur représentative...
Autre chose, quand vous utilisez une variable à partir d'un autre module, cette variable devient automatiquement globale.
Voici un exemple
mod1.py
mod2.py
Comme on le voit on peut modifier la valeur de la variable ordonnees sans utilisation du mot clé global.
Peut-être n'ai je pas compris, mais l'exemple dans ce cas est mal choisi.
Si vous importez la fonction disparaitre du module valider.py, que vaut no_case dans main.py ? Vous avez sans doute un NameError comme erreur représentative...
Autre chose, quand vous utilisez une variable à partir d'un autre module, cette variable devient automatiquement globale.
Voici un exemple
mod1.py
import mod2 def disparaitre(no_case): mod2.ordonnees[no_case] = 610
mod2.py
ordonnees=[50,610]
Comme on le voit on peut modifier la valeur de la variable ordonnees sans utilisation du mot clé global.
Peut-être n'ai je pas compris, mais l'exemple dans ce cas est mal choisi.
pols12
Messages postés
1143
Date d'inscription
lundi 22 mars 2010
Statut
Membre
Dernière intervention
31 juillet 2019
119
9 mai 2014 à 23:31
9 mai 2014 à 23:31
D'abord, dans mon exemple, ça n'était pas
Merci beaucoup pour ta solution :)
J'en ai trouvé une autre pour conserver la modularité :
Il suffit que valider() retourne no_case au lieu de faire appel à disparaitre().
Et dans mod1.py on affecte 610 à ordonnees[valider()]
Du coup disparaitre() devient inutile.
Ce qui donne ce code :
mod1.py
mod2.py
if y < 700 :mais
if y[4*i+a] < 700 :ce qui est plus logique.
Merci beaucoup pour ta solution :)
J'en ai trouvé une autre pour conserver la modularité :
Il suffit que valider() retourne no_case au lieu de faire appel à disparaitre().
Et dans mod1.py on affecte 610 à ordonnees[valider()]
Du coup disparaitre() devient inutile.
Ce qui donne ce code :
mod1.py
from mod2 import * ordonnees=[610,610,610] #on initialise la variable globale ordonnees while 1==1 :#boucle infinie pour garder la fenêtre ouverte if evenement.key == K_q : #si on appuie sur la touche Q au clavier if(type(valider(ordonnees,1)==int) : #pour éviter que ça bug quand valider() retourne False ordonnees[valider(ordonnees,1)]=610 if evenement.key == K_s : #si on appuie sur la touche S au clavier if(type(valider(ordonnees,2)==int) : #pour éviter que ça bug quand valider() retourne False ordonnees[valider(ordonnees,2)]=610 ordonnees+=1
mod2.py
def valider(y,a) : if y[4*i+a] < 700 : return 4*i+a #où i est un compteur qui vaut 0, 1 ou 2 return False #4*i+a donne en fait l'index d'un des éléments de ordonnees[]
9 mai 2014 à 09:35
C'est très simple, la fonction valider, prend en paramètre y, qui est une liste ou pas. Si c'est une liste, on ne peut pas faire la comparaison entre liste et entier (ligne 2 de mod.py). Dans le cas où c'est un entier, cette ligne est correcte, mais la ligne suivante ne l'est plus, car on demande la modification de ordonnees, sans l'avoir importé précédemment.
Dans mod2.py il aurait fallu importer ordonnees
Le soucis, c'est que tu vas avoir à faire à une importation cyclique, mod2 importe mod1 qui importe mod2 qui importe mod1, etc...
Ce qui veut dire erreur de conception. Voilà ce que je propose...
Fait tout le boulot sur ordonnees dans mod1 et non mod2.
Tu crées tout simplement la fonction disparaître et valider dans mod1.
Du coup la ligne 8 de mod2, n'est plus utile, et à l'interpréteur ça se vérifie très simplement