Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 11, 2016 12:59:32

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Цикличный импорт

Всем привет.
Столкнулся с проблемой, подозреваю что у меня происходит цикличный импорт. Имеется следующее древо:



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

Пакет 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, как показано выше - все нормально.
Никак не могу понять почему так происходит. Люди добрые, подскажите пожалуйста. Проектик прикрепил архивом.

Отредактировано moskitos80 (Фев. 11, 2016 13:02:08)

Прикреплённый файлы:
attachment problem.zip (1,9 KБ)

Офлайн

#2 Фев. 11, 2016 17:27:59

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Цикличный импорт

from index import database

Что это такое ?

Офлайн

#3 Фев. 11, 2016 19:29:04

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Цикличный импорт

ayb
Это импорт переменной. Переменную назвал “database” просто, без всякого умысла

Офлайн

#4 Фев. 12, 2016 07:51:54

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Цикличный импорт

Так определи эту пременную там где она нужна.

Офлайн

#5 Фев. 12, 2016 09:24:48

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Цикличный импорт

ayb
Так определи эту пременную там где она нужна.
Уважаемые, я наверно не так выразился в самом начале. Мне нужна информация не о том как сделать, что бы заработал именно этот код, а мне нужна информация о том что происходит, и почему возникает ошибка. Представленный код является искусственной моделью проблемы. Я знаю как сделать что бы он заработал. Я хочу поиметь опыт, который мне позволит в дальнейшем, при проектировании, учитывать и избегать этой, и подобных этой ситуаций.

Офлайн

#6 Фев. 12, 2016 10:43:06

ayb
Зарегистрирован: 2014-04-01
Сообщения: 297
Репутация: +  24  -
Профиль   Отправить e-mail  

Цикличный импорт

Так проблема как раз из-за этой пременной и возникает т.к. блюпринты импортируют друг друга. Или выноси ее в конфиг или определяй ее там где она будет использоваться.

Офлайн

#7 Фев. 12, 2016 13:45:24

moskitos80
От: Luna
Зарегистрирован: 2015-01-28
Сообщения: 18
Репутация: +  0  -
Профиль  

Цикличный импорт

ayb
Так проблема как раз из-за этой пременной и возникает т.к. блюпринты импортируют друг друга. Или выноси ее в конфиг или определяй ее там где она будет использоваться.
Благодарю. Разобрался используя трассировку при помощи print в начале и в конце файлов. В итоге поимел полную картину происходящего. На самом деле проблема не из за того что блюпринты импортируют друг друга, а из за того что модуль shop пытается получить доступ к пока ещё не заполненному пространству имен модуля models.user.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version