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
Salut !
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 !

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
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
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 ! ;)
1
Utilisateur anonyme
9 mai 2014 à 09:35
Oui c'est évident que ça ne fonctionne pas, pourquoi ?

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

from mod1 import 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

>>> ordonnees = [400, 610, 610]
>>> def disparaitre(n):
...     if 0 <= n < len(ordonnees):
...         ordonnees[n] = 610
... 


>>> disparaitre(0)
>>> ordonnees
[610, 610, 610]
0
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
Up !
0
Utilisateur anonyme
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...
0
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
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. ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
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

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.
0
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
D'abord, dans mon exemple, ça n'était pas
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[]

0