Найти - Пользователи
Полная версия: Цикличный импорт
Начало » Python для новичков » Цикличный импорт
1
moskitos80
Всем привет.
Столкнулся с проблемой, подозреваю что у меня происходит цикличный импорт. Имеется следующее древо:



Содержимое файлов:

Пакет auth:
auth/__init__.py
auth_blpr = True
from . import views as auth_views

auth/views.py
from models.user import User

Пакет models:
models/__init__.py - пустой
models/user.py
from index import database
class User: pass

Пакет shop:
shop/__init__.py
shop_blpr = True
from . import views as shop_views

shop/views.py
from models.user import User

Собственно index.py - точка входа:
database = 'spam'
from auth import auth_blpr      # если закомментировать эту строку ...
from shop import shop_blpr    # ... или эту то все в порядке!!!

Получаю следующее:

Traceback (most recent call last):
File “/home/komarov/PycharmProjects/untitled/index.py”, line 3, in <module>
from auth import auth_blpr
File “/home/komarov/PycharmProjects/untitled/auth/__init__.py”, line 3, in <module>
from . import views as auth_views
File “/home/komarov/PycharmProjects/untitled/auth/views.py”, line 1, in <module>
from models.user import User
File “/home/komarov/PycharmProjects/untitled/models/user.py”, line 1, in <module>
from index import database
File “/home/komarov/PycharmProjects/untitled/index.py”, line 4, in <module>
from shop import shop_blpr
File “/home/komarov/PycharmProjects/untitled/shop/__init__.py”, line 3, in <module>
from . import views as shop_views
File “/home/komarov/PycharmProjects/untitled/shop/views.py”, line 1, in <module>
from models.user import User
ImportError: cannot import name ‘User’

Причем, если закомментировать одну из строк в index.py, как показано выше - все нормально.
Никак не могу понять почему так происходит. Люди добрые, подскажите пожалуйста. Проектик прикрепил архивом.
ayb
from index import database

Что это такое ?
moskitos80
ayb
Это импорт переменной. Переменную назвал “database” просто, без всякого умысла
ayb
Так определи эту пременную там где она нужна.
moskitos80
ayb
Так определи эту пременную там где она нужна.
Уважаемые, я наверно не так выразился в самом начале. Мне нужна информация не о том как сделать, что бы заработал именно этот код, а мне нужна информация о том что происходит, и почему возникает ошибка. Представленный код является искусственной моделью проблемы. Я знаю как сделать что бы он заработал. Я хочу поиметь опыт, который мне позволит в дальнейшем, при проектировании, учитывать и избегать этой, и подобных этой ситуаций.
ayb
Так проблема как раз из-за этой пременной и возникает т.к. блюпринты импортируют друг друга. Или выноси ее в конфиг или определяй ее там где она будет использоваться.
moskitos80
ayb
Так проблема как раз из-за этой пременной и возникает т.к. блюпринты импортируют друг друга. Или выноси ее в конфиг или определяй ее там где она будет использоваться.
Благодарю. Разобрался используя трассировку при помощи print в начале и в конце файлов. В итоге поимел полную картину происходящего. На самом деле проблема не из за того что блюпринты импортируют друг друга, а из за того что модуль shop пытается получить доступ к пока ещё не заполненному пространству имен модуля models.user.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB