Variables globales et modules
Résolu
pols12
Messages postés
1143
Date d'inscription
Statut
Membre
Dernière intervention
-
pols12 Messages postés 1143 Date d'inscription Statut Membre Dernière intervention -
pols12 Messages postés 1143 Date d'inscription Statut Membre Dernière intervention -
Salut !
Je travaille en Python 2.7.
J'ai un petit problème de portée des variables.
Dans main.py :
Dans valider.py :
Le problème c'est que ordonnees n'est globale que dans le fichier main.py et est inconnue dans le module valider.py
J'ai eu l'idée de créer un module ne contenant que des variables globales dont ordonnees. Le problème est que si j'importe ce module dans valider.py il ne prendra pas en compte les modifications faites par main.py, si ?
Comment faire ?
Merci à vous !
Je travaille en Python 2.7.
J'ai un petit problème de portée des variables.
Dans main.py :
from valider.py import * ordonnees=[50,610] disparaitre(no_case)
Dans valider.py :
def disparaitre(no_case) : global ordonnees ordonnees[no_case]=610
Le problème c'est que ordonnees n'est globale que dans le fichier main.py et est inconnue dans le module valider.py
J'ai eu l'idée de créer un module ne contenant que des variables globales dont ordonnees. Le problème est que si j'importe ce module dans valider.py il ne prendra pas en compte les modifications faites par main.py, si ?
Comment faire ?
Merci à vous !
A voir également:
- Variables globales et modules
- Modules complémentaires chrome - Guide
- Nuage de points excel 4 variables - Forum Excel
- Steam fatal error failed to load platform modules ✓ - Forum Jeux vidéo
- Gérer les modules mail mac - Forum MacOS
- L'installateur de modules windows doit être mis à jour avant d'installer ce package ✓ - Forum Mozilla Firefox
6 réponses
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 ! ;)
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...
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
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.
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[]
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