OVH Cloud OVH Cloud

Visibilité des variables entre module

4 réponses
Avatar
ReM
Bonjour,

Je pense que cette question a déjà été posée mais bon.

J'ai une variable i dans mon fichier python ( qui va être lancer a la
main ). J'appelle ensuite une fonction d'un module qui elle même appelle
une fonction d'un 3ème module dans lequel je veux récupérer i sans le
passer en variable aux fonctions.

main.py :
=========
from module1 import *

i=5
affiche1()

module1.py :
============
from module2 import *

def affiche1():
affiche2()

module2.py :
============
def affiche2():
print i

J'ai bien essayé de mettre des 'global i' un peu partout mais ça marche
pas :o(

Merci pour conseils

Rémi

4 réponses

Avatar
F. Petitjean
Bonjour,

Je pense que cette question a déjà été posée mais bon.

J'ai une variable i dans mon fichier python ( qui va être lancer a la
main ).
Cela veut dire quoi être lancé à la main ? Vous le metez sur une

disquette que vous balancez par la fenêtre ? :-)
J'appelle ensuite une fonction d'un module qui elle même appelle
une fonction d'un 3ème module dans lequel je veux récupérer i sans le
passer en variable aux fonctions.
Et pourquoi donc ne pas passer en variable/paramètre de fonction ?


main.py :
======== > from module1 import *
C'est dangereux import *, et import affiche1 n'est pas très long à

taper avec les éditeurs actuels

i=5
affiche1()

module1.py :
=========== > from module2 import *
import module2 # pour changer


def affiche1():
affiche2()
module2.affiche2()


module2.py :
=========== import main # accéder à i
def affiche2():
print i
print main.i


J'ai bien essayé de mettre des 'global i' un peu partout mais ça marche
pas :o(
Une règle simple : ne pas mettre de global et passer pylint. Si vraiment

vous avez besoin de global revoir la conception.

Merci pour conseils
1. Ne pas mettre des variables dont le nom ne veut rien dire

2. Réfléchir un peu avant de mettre des modules partout, faire des
regroupements judicieux pour ne pas avoir de circuit (circular import)

Faudrait nous donner un peu plus d'informatiosn sur ce que vous voulez
faire.

Cordialement

Rémi


Avatar
Do Re Mi chel La Si Do
Bonjour !


C'est normal, les variables ne "passent" pas entre modules.

Solution :

Utilise un module pour les échanges inter-modules. Par exemple, tu crées
interm.py, avec une seule ligne :
j3 # j'ai volontairement utilisé un autre nom de variable.


Ensuite, tu modifies ton main, comme suit :
import interm
from module1 import *

interm.i=5
affiche1()


Et modifies le module2 :
import interm

def affiche2():
print interm.i




Le problème, dans tes scripts, c'est que module2 est exécuté avant main.py
(via l'importation du module1). On ne peut donc pas y importer une
définition de main.

Autre chose : les "from ... import *" ramènent un ensemble de noms
d'objets, avec une difficulté pour voir lequels sont définis. Le risque de
conflit de nom est alors grand.
A réserver, de préférence, à des modules que l'on connaît bien.



@-salutations
--
Michel Claveau
Avatar
ReM
Je demandais pas un cours sur la programmation j'essayais de donner un
exemple simple :p

en fait j'ai plusieurs modules :
un module personne ou j'ai des fonctions de création et de modifications
de personnes
un module rendezvous qui j'ai la creation et la modification de
rendez-vous. Et dans se module j'apelle une fonction de création (ou de
modifactions ) de personnes.

Ensuite j'utilise un cgi qui me gère tout ça !

Le but est de savoir qui fait quoi et quand. Donc à chaque fois que je
modifie une personne, je veux connaitre qui l'a fait. Or avant
j'utilisais un htaccess donc je pouvais récupérer l'utilisateur avec un
os.environ['REMOTE_USER'] mais maintenant je passe par un login dans une
page HTML que je conserve en variable de session.

Donc quand j'exécute mon CGI, je passe un numéro de session et je
retrouve mon utilisateur mais ensuite j'appelle ( par exemple ) une
fonction de création de rdv avec création de la personne, donc je vais
dans le module rendezvous et ensuite dans le module personne. Mais je ne
voulais pas remodifier l'ensemble des mes fonctions en passant
l'utilisateur !

Voila un peu plus d'explications sur ce que je veux faire mais je pense
que mon exemple avec ma variable i est très compréhensible :)

Rémi



Bonjour,

Je pense que cette question a déjà été posée mais bon.

J'ai une variable i dans mon fichier python ( qui va être lancer a la
main ).


Cela veut dire quoi être lancé à la main ? Vous le metez sur une
disquette que vous balancez par la fenêtre ? :-)

J'appelle ensuite une fonction d'un module qui elle même appelle
une fonction d'un 3ème module dans lequel je veux récupérer i sans le
passer en variable aux fonctions.


Et pourquoi donc ne pas passer en variable/paramètre de fonction ?

main.py :
======== >>from module1 import *


C'est dangereux import *, et import affiche1 n'est pas très long à
taper avec les éditeurs actuels

i=5
affiche1()

module1.py :
=========== >>from module2 import *


import module2 # pour changer

def affiche1():
affiche2()


module2.affiche2()

module2.py :
=========== >
import main # accéder à i


def affiche2():
print i


print main.i

J'ai bien essayé de mettre des 'global i' un peu partout mais ça marche
pas :o(


Une règle simple : ne pas mettre de global et passer pylint. Si vraiment
vous avez besoin de global revoir la conception.

Merci pour conseils


1. Ne pas mettre des variables dont le nom ne veut rien dire
2. Réfléchir un peu avant de mettre des modules partout, faire des
regroupements judicieux pour ne pas avoir de circuit (circular import)

Faudrait nous donner un peu plus d'informatiosn sur ce que vous voulez
faire.

Cordialement

Rémi




Avatar
Do Re Mi chel La Si Do
Bonsoir !

Et mon exemple te convient-il ?

@-salutations
--
Michel Claveau