2017-02-02 13 views
0

Мой код немного сложен, так что я покажу пример:питон ImportError: не может импортировать имя

файл A.py:

from B import B 

class A(): 

def __init__(self): 

    self.id = 5 

    self.b = B() 

файл B.py

from A import A 

class B(): 

def __init__(self): 

    self.id = 15 

    self.a = A() 

Это исключение я получаю:

Traceback (most recent call last): 
File "F:/Project/Code/A.py", line 1, in <module> 
from B import B 
File "F:\Project\Code\B.py", line 1, in <module> 
from A import A 
File "F:\Project\Code\A.py", line 1, in <module> 
from B import B 
ImportError: cannot import name B 

Все Я хочу, чтобы A содержал экземпляр B и B, чтобы содержать экземпляр A. Я знаю, что все, что мне нужно сделать, это преобразовать их в один файл, но я не хочу, мой код находится на гораздо больших масштабах и мой учитель заставляет меня хранить несколько коротких скриптов вместо одного длинного кода.

Любое предложение будет оценено по достоинству.

+1

«Все, что я хочу, это чтобы содержать экземпляр B и B, чтобы содержать экземпляр A "- даже если вы разрешите проблему с циклическим импортом, это по-прежнему в основном b графический дизайн. A содержит B, который содержит другой A, который содержит другой B и т. Д. Создание одного из этих объектов требует создания бесконечного числа объектов. – user2357112

+1

См. Этот вопрос: http://stackoverflow.com/questions/11698530/two-python-modules-require-each-others-contents-can-that-work – ScottSmudger

+0

Я полагаю, что он мог бы указать максимальную глубину рекурсии создания как-то, но это довольно тяжелая метатема – Woody1193

ответ

0

Вы получаете ошибку, потому что ваши скрипты имеют рекурсивный импорт.

A.py зависит от: B module. Но B.py зависит от: A module. И Python не может разрешить импорт.

Вы можете написать все классы в одном модуле. Или убедитесь, что циклическая зависимость не существует.

Та же проблема может быть связана с импортом переменных, функций.

+0

Если кто-то хочет обсудить это. Напишите мне в комментариях. Я не понимаю, почему мой ответ не полезен. –

+0

Спасибо за откат ... –

+1

О, я прочитал это как отредактированное редактирование, vs откат голосов, следовательно, проверка истории изменений (мой первый прочтение выше был как саркастический ответ кому-то, кто откатывает редактирование вы думали, что все в порядке). Извинения. –

0

Вы не можете иметь двустороннюю зависимость, потому что это будет означать каждый b недвижимость в A является B экземпляр, который содержит свой собственный A и так далее.

A 
- id: 5 
- b: B 
    - id: 15 
    - a: A 
      - id: 15 
      - b: B ... 
-1

Вы не можете. Теперь это похоже на цикл. Если вы импортируете один, он импортирует другой.

Кроме того, вам необходимо было добавить пробелы после class A(): и class B():. Ваш код будет:

Файл A.py

from B import B 

class A(): 

    def __init__(self): 

     self.id = 5 

     self.b = B() 

файл B.py:

from A import A 

class B(): 

    def __init__(self): 

     self.id = 15 

     self.a = A() 
+0

Правда, что нужны пространства, ложные, что взаимный импорт будет работать после их добавления. –

+0

Мы не должны троллировать людей, у которых есть реальные проблемы. – Woody1193

+0

Я не знал ... Пожалуйста, не спускайте вниз! –

0

Что вы называется импорт-цикл. Как вы идете об исправлении, перемещаете взаимозависимый код в класс C, который как в случае ссылки.

В C.py:

def class C: 

    def __init__(self): 
     # Do some stuff 

    # other methods 

В A.py:

from C import C 

def class A(C): 

    def __init__(self): 
     # Do some stuff in A 

    # other methods 

В B.py:

from C import C 

def class B(C): 

    def __init__(self): 
     # Do some stuff in B 

    # other methods 

 Смежные вопросы

  • Нет связанных вопросов^_^