ImportError: Impossible d'importer le nom X

J'ai quatre différents fichiers nommés: main, vecteur, d'une entité et de la physique. Je ne vais pas poster tout le code, juste les importations, parce que je pense que c'est là où est l'erreur. (Si vous voulez, je peux plus poster)

Principal:

import time
from entity import Ent
from vector import Vect
#the rest just creates an entity and prints the result of movement

Entité:

from vector import Vect
from physics import Physics
class Ent:
    #holds vector information and id
def tick(self, dt):
    #this is where physics changes the velocity and position vectors

Vecteur:

from math import *
class Vect:
    #holds i, j, k, and does vector math

Physique:

from entity import Ent
class Physics:
    #physics class gets an entity and does physics calculations on it.

Je puis exécutez à partir de main.py et j'obtiens l'erreur suivante:

Traceback (most recent call last):
File "main.py", line 2, in <module>
    from entity import Ent
File ".../entity.py", line 5, in <module>
    from physics import Physics
File ".../physics.py", line 2, in <module>
    from entity import Ent
ImportError: cannot import name Ent

Je suis très nouveau à Python, mais ont travaillé avec C++ pour un long moment. Je suppose que l'erreur est due à l'importation de l'entité à deux reprises, une fois en main, et plus tard dans la physique, mais je ne sais pas une solution de contournement. Quelqu'un peut-il aider?

  • Quelle est la structure de répertoire de l'endroit où ils sont stockés et dans quels répertoires?
  • jetez un oeil à cette réponse de la boucle de l'importation en python: stackoverflow.com/questions/7199466/...
  • En général, ce n'est pas les bonnes pratiques de codage à faire from <module> import <name>, ou from <modlue> import *. Mieux à importer dans le cadre du module de l'espace de noms pour éviter la possibilité de remplacer à l'identique nommé références.
  • Ils sont tous dans le même répertoire nommé "code", donc pas de réelle structure.
  • Donc, ce que Joël est en train de dire, je devrais probablement utiliser 'importation de vecteur et de l'utilisation de 'x = vecteur.Vect(0,0,0)'? Et peut-être que c'est clair?
  • si le module est dans un sous-répertoire, est-il une réponse simple? L'importation fonctionne très bien à partir du répertoire contenant le module, mais pas à partir du répertoire parent. Il y a un __init__.py qui fonctionne jusqu'à ce qu'il ne peut pas importer de nom _foo. Pour l'enregistrement, _foo en C.
  • Vous devriez juste d'appel de vos classes Entity et Vector au lieu de Ent et Vect, il n'y a aucune raison de raccourcir ces noms. Et oui, l'utilisation import vector et puis x = vector.Vector(0,0,0).
  • Hey @Kevin puisque vous connaissez Java mieux, quelle est votre impression de ce 2008 article où l'auteur de la première phrase fait référence à la façon dont les dépendances circulaires sont "assez courant" en Java ?
  • Toutes les grandes langues prend en charge la circulaire importations sans problème... C#, C, C++, Java, Objective-C... Ce n'est pas 1991.
  • J'ai répondu à une question très semblable ici: stackoverflow.com/questions/50312470/...
  • Si vous ne pouvez pas obtenir loin de dépendances circulaires, vous pouvez les importer directement dans la fonction ou de la classe dans laquelle vous avez besoin de la dépendance à la place de mondial pour le fichier

InformationsquelleAutor jsells | 2012-02-12