Bonjour,

je developpe en Python depuis qq mois maintenant mais il y a un point qui me cause du souci regulierement: les espaces de noms propres a chaque module. J'etais justement en train de faire le point la-dessus quand je n'ai pas eu le comportement attendu...

J'ai ecris un petit pure python module a ce propos:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
shell> cat importtest.py
def execute(string):
    exec(string) in globals()
 
def globadd(name,value):
    globals()[name] = value
Quand j'importe le module dans le main python, j'ai le comportement attendu:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
>>> import importtest
>>>
>>> dir(importtest)
['__builtins__', '__doc__', '__file__', '__name__', 'execute', 'globadd']
>>> importtest.execute('a = 1')
>>> importtest.globadd('b',2)
>>> dir(importtest)
['__builtins__', '__doc__', '__file__', '__name__', 'a', 'b', 'execute', 'globadd']
>>> importtest.a
1
>>> importtest.b
2
Mais quand j'importe les elements du module dans le main:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
>>> from importtest import *
>>> dir()
['__builtins__', '__doc__', '__name__', 'execute', 'globadd']
>>> execute('a = 1')
>>> globadd('b',2)
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'a' is not defined
>>> b
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
NameError: name 'b' is not defined
>>> dir()
['__builtins__', '__doc__', '__name__', 'execute', 'globadd']
>>> execute('print a, b')
1 2
a et b ont bien une existence.... mais ou??? J'etais persuade que je les retrouverai dans l'espace des noms du main car les fonctions qui les definissent (en tant que variables globales) appartiennent elles-meme au main...

Question subsidiaire: comment confier a une fonction qui n'est pas dans le code principal (mais importable via 'from monmodule import mafonction') la creation d'une variable globale au main? J'ai plusieurs codes qui en ont besoin et je voulais mutualiser cette fonction dans un meme module (pour m'eviter de maintenir plusieurs fois la meme fonction)...

Merci