package : import de tout le monde vers tout le monde

Le
Laurent Claessens
Bonjour

J'ai un package qui contient 3 modules. Je voudrais que chacun des
trois puisse faire
from import *
des deux autres.

Mes fichiers sont:

__init__.py
foo.py
bar.py

et le tout est dans le répertoire spam.

Le fichier __init__.py contient seulement le docstring et des import
des trois autres.
J'ai des fonctions dans foo.py qui appellent des fonctions dans bar.py
et inversement.

Dans foo.py j'ai mis

from spam import *
from bar import *

Dans bar.py j'ai mis

from spam import *
from foo import *

Et enfin, le tout est appelé depuis un script hello.py qui fait
seulement `from spam import *`.

En regardant un peu la doc et le forum, je n'ai pas trouvé de
solutions (utiliser __all__ ??).
Par contre j'ai entendu dire que ma situation était probablement une
faute de conception du programme. Ça ne devrait pas arriver que deux
modules "frères" dans un package doivent s'appeler mutuellement.

Comment faire ? Dois-je réviser la structure de mon programme ?

Merci
bonne après-midi
Laurent
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Laurent Pointal
Le #23317361
Laurent Claessens wrote:

Bonjour

J'ai un package qui contient 3 modules. Je voudrais que chacun des
trois puisse faire
from ... import *
des deux autres.

Mes fichiers sont:

__init__.py
foo.py
bar.py

et le tout est dans le répertoire spam.

Le fichier __init__.py contient seulement le docstring et des import
des trois autres.
J'ai des fonctions dans foo.py qui appellent des fonctions dans bar.py
et inversement.

Dans foo.py j'ai mis

from spam import *
from bar import *

Dans bar.py j'ai mis

from spam import *
from foo import *

Et enfin, le tout est appelé depuis un script hello.py qui fait
seulement `from spam import *`.

En regardant un peu la doc et le forum, je n'ai pas trouvé de
solutions (utiliser __all__ ??).
Par contre j'ai entendu dire que ma situation était probablement une
faute de conception du programme. Ça ne devrait pas arriver que deux
modules "frères" dans un package doivent s'appeler mutuellement.

Comment faire ? Dois-je réviser la structure de mon programme ?



J'ai déjà eu des problèmes similaires, que j'avais résolu en déplaçant un
des imports à la fin du module (note: ça n'est possible que si tu n'as pas
besoin d'appeller les fonctions importées tout de suite).

A+
Laurent aussi
Laurent Claessens
Le #23319131
J'ai déjà eu des problèmes similaires, que j'avais résolu en dé plaçant un
des imports à la fin du module (note: ça n'est possible que si tu n'a s pas
besoin d'appeller les fonctions importées tout de suite).



mwuoias ... ça ne fonctionne pas tellement dans mon cas.

En essayant de réorganiser mon package, je suis tombé sur une
question :

============== script.py ======= ==
from tests import *
[...]
========================= ==

====__init__.py================= ====
from submodule import UneFonction

def AutreFonction:pass
========================= ========

=====submodule.py================ ========
from tests import AutreFonction

def UneFonction: pass
========================= ===========


Dans ce cas, il y a un plantage : python ne peut pas importer
"AutreFonction".

Question : quand je fais "from X import A", il exécute les "import" de
X ??


Mon idée était de mettre tous les constructeurs dans __init__ et les
importer dans les sous-modules.

J'ai trouvé pas mal de doc sur le fonctionnement des importation de
modules, mais pas grand chose sur la façon dont les appels circulaires
sont gérés.

des idées ?
Bonne journée
Laurent
Publicité
Poster une réponse
Anonyme