2012-04-16 3 views
0

Можно создать дубликат:
Python: Circular (or cyclic) importsИмпорт конфликта в Python?

Я новичок в Python, и у меня вопрос, но я не совсем уверен, что это моя проблема. У меня есть два файла: user.py и comments.py. В user.py, я

from comments import Comment 

и comments.py я

from user import User 

Мои пользователь загружает нормально, но когда я загрузить URL, который ведет к комментариям, я получаю ошибку сервера. Замечание from comments import Comment устраняет проблему. Я делаю что-то неправильно?

+1

Не могли бы вы показать нам содержимое файла 'comments.py'? – Tadeck

ответ

1

Да, у вас есть круговой импорт, и это вызывает много проблем. Если вы думаете о том, что на самом деле происходит при импорте, это аналогично высказыванию: «Скопируйте код из файла x в этот файл», но если вы скопируете из x в y, а затем обратно из y в x, вы создали бесконечный цикл, когда интерпретатору трудно понять, какой модуль должен заменять или загружать, в каких ситуациях. Однако, если ваша программа правильно настроена, у вас ее не должно быть. Какую причину у вас есть для этого кругового импорта? Скорее всего, вам это совсем не нужно, если мы посмотрим на проблему немного осторожнее.

+0

Ну, оба файла нужны друг другу. Нет ли способа исправить это? – Snowman

+3

@mohabitar: Да, исправьте свой дизайн. –

+0

Благодарим вас за понимание Sven. Во всяком случае, я думал, что просто упорядочу свой код в два отдельных файла. Я не хочу, чтобы функции, связанные с пользователем, были в том же файле, что и функции, связанные с комментариями. Поэтому я отделил их. Но так как Пользователь может публиковать комментарии, а комментарию нужен пользователь, мне нужно ссылаться на них. Есть лучший способ сделать это? – Snowman

1

Этот вид циркулярного импорта не работает. Импорт модуля означает, по существу, выполнение в нем утверждений. Операторы import выполняются в тот момент, когда они встречаются, поэтому, по крайней мере, в одном из модулей другой модуль еще не был инициализирован, поэтому импорт завершится неудачно.

Круговая зависимость считается антипаттерн. Бывают ситуации, когда они каким-то образом происходят естественным образом, но в целом они являются признаком плохого дизайна.

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