Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

package : import de tout le monde vers tout le monde

2 réponses
Avatar
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=E9pertoire 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=E9 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=E9 de
solutions (utiliser __all__ ??).
Par contre j'ai entendu dire que ma situation =E9tait probablement une
faute de conception du programme. =C7a ne devrait pas arriver que deux
modules "fr=E8res" dans un package doivent s'appeler mutuellement.

Comment faire ? Dois-je r=E9viser la structure de mon programme ?

Merci
bonne apr=E8s-midi
Laurent

2 réponses

Avatar
Laurent Pointal
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
Avatar
Laurent Claessens
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