2010-11-09 6 views
0

Je rencontre des problèmes lors de l'importation d'une classe à partir d'un module particulier. La classe est dans le module my_module1.my_module2.my_module3.my_module4.my_module5.my_module6.my_module7Problème d'importation Python

Ce code fonctionne

import my_module1.my_module2.my_module3.my_module4.my_module5.my_module6.my_module7 

ce qui signifie pour accéder ma classe que je dois faire

my_module1.my_module2.my_module3.my_module4.my_module5.my_module6.my_module7.MyClass 

mais cela ne

from my_module1.my_module2.my_module3.my_module4.my_module5.my_module6.my_module7 import MyClass 

Ni le fait

my_module1.my_module2.my_module3.my_module4.my_module5.my_module6.my_module7 à l'importation comme my_name

cette erreur donnent tous deux en disant

AttributeError: 'module' object has no attribute my_module7' 

Cela m'a complètement déconcerté et je travaille là-dessus pour un couple de semaines maintenant. Aucune suggestion?

EDIT - Je ne peux pas changer la structure, malheureusement, comme elle est imposée par le système que je utilise

Répondre

3

Cela ressemble à une importation circulaire. Gordon McMillan dit: Les importations circulaires sont très bien lorsque les deux modules utilisent la forme d'importation "import". Ils échouent quand le 2ème module veut attraper un nom du premier ("du nom d'importation de module") et l'importation est au niveau supérieur. C'est parce que les noms du 1er ne sont pas encore disponibles, car le premier module est occupé à importer le 2ème.

+0

+1 J'aurais dû y penser. Bonne suggestion, on verra où ça finit. – Crisfole

+0

Oui, il s'agit d'une importation circulaire. J'ai besoin d'accéder à une variable de classe de la classe que j'essaie d'importer. Que suggérez-vous de contourner cela? Suis-je le meilleur pour repenser le design un peu? –

+0

Eh bien, pour le contourner, il vous suffit de déplacer votre importation du niveau supérieur dans une fonction ou une classe. Une refonte pourrait être le meilleur, mais c'est votre appel. – toc777

0

Je pense que vous voudrez peut-être envisager une autre conception en premier lieu (la refonte de votre ventilation du module il est donc une configuration plus plate), mais ce n'est pas votre essai de question:

import my_module1.my_module2.my_modu...<etc> 
my_name = my_module1.my_module2.my_modu...<etc> 
my_name.MyClass 

un module est un objet de première classe en python, de sorte que vous pouvez les alias avec des variables.

+0

Ce code donne AttributeError: objet 'module' n'a pas my_module7' d'attribut sur la ligne avec le my_name = ... –

+0

Pouvez-vous essayer: my_module1.my_module2.my_module import ..... dir (my_module1 .my_mod .... my_module6) évidemment remplir les chemins complets! Dites-le moi – Crisfole

+0

Je reçois un AttributeError sur cette ligne maintenant! (celui avec le dir (...)) –