505 votes

Circulaire (ou cyclique) importations en Python

Ce qui va se passer si deux modules d'importation les uns des autres?

De généraliser le problème, ce qui sur le cyclique des importations en Python?

349voto

Shane C. Mason Points 4074

Il y avait vraiment une bonne discussion sur ce fil à comp.lang.python l'année dernière. Il répond à votre question très soigneusement.

Les importations sont assez simple, vraiment. Juste rappeler les points suivants:

"importer" et "de xxx importation yyy" sont des instructions exécutables. Ils exécutent lors de l'exécution du programme atteint cette ligne.

Si un module n'est pas dans sys.des modules, puis une importation crée le nouveau module l'entrée dans le sys.les modules puis exécute le code dans le module. Il n'a pas redonner le contrôle à l'appelant le module jusqu'à ce que l'exécution est terminée.

Si un module n'existe pas dans sys.les modules puis une importation retourne simplement que module de si oui ou non il a terminé de s'exécuter. C'est la raison pourquoi cyclique des importations peut retourner les modules qui semblent être en partie vide.

Enfin, l'exécution du script s'exécute dans un module nommé __principaux__, de l'importation le script sous son propre nom, permettra de créer un nouveau module sans rapport avec __principaux__.

Prendre que beaucoup de choses ensemble et vous ne devriez pas faire des surprises lors de l'importation les modules.

124voto

Torsten Marek Points 27554

Cyclique des importations de mettre fin, mais vous devez être prudent de ne pas utiliser les variations conjoncturelles modules importés au cours de l'initialisation du module.

Examiner les fichiers suivants:

un.py:

print "a in"
import sys
print "b imported: %s" % ("b" in sys.modules, )
import b
print "a out"

b.py:

print "b in"
import a
print "b out"
x = 3

Si vous exécutez une.py, vous aurez la suivante:

$ python a.py
a in
b imported: False
b in
a in
b imported: True
a out
b out
a out

Sur la deuxième importation de b.py (dans le deuxième a in), l'interpréteur Python ne pas importer b encore, parce qu'il existe déjà dans le module dict.

Edit: Si vous essayez d'accéder b.x de a lors de l'initialisation du module, vous obtiendrez un AttributeError.

Ajouter la ligne suivante à l' a.py:

print b.x

Ensuite, la sortie est:

$ python a.py
a in                    
b imported: False
b in
a in
b imported: True
a out
Traceback (most recent call last):
  File "a.py", line 4, in <module>
    import b
  File "/home/shlomme/tmp/x/b.py", line 2, in <module>
    import a
 File "/home/shlomme/tmp/x/a.py", line 7, in <module>
    print b.x
AttributeError: 'module' object has no attribute 'x'

C'est parce que les modules sont exécutés à l'importation et à l'époque, b.x est accessible, la ligne x = 3 a ne pas être exécuté, ce qui ne sera possible après l' b out.

13voto

Xolve Points 4422

J'ai un exemple ici qui m'a frappé!

foo.py

import bar

class GO(object):
    g = 10

bar.py

from foo import gX

o = gX()

main.py

import foo
import bar

print "all done"

Sur la ligne de commande: $ python main.py

*Traceback (most recent call last):
  File "m.py", line 1, in <module>
    import foo
  File "/home/xolve/foo.py", line 1, in <module>
    import bar
  File "/home/xolve/bar.py", line 1, in <module>
    from foo import gX
ImportError: cannot import name gX*

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X