Importation de modules et espaces de noms
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:
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:
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:
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