Как я могу импортировать определенный модуль с неоднозначным именем? - PullRequest
1 голос
/ 08 июля 2011

Это происходит в контексте Django, но вопрос не относится к Django.

Я пытаюсь разделить мой большой urls.py на более мелкие и более управляемые куски (приложение включает в себя сторонние модули, поиск, админ, разработка и тд).Поэтому вместо urls.py я сейчас использую каталог urls/, где urls/__init__.py содержит такой код:

import admin
urlpatterns += admin.urlpatterns

Теперь у меня возникли проблемы со сторонними модулями.Например, я переопределяю кучу URL-адресов и представлений для django-messages, поэтому я поместил все это в urls/messages.py.Оказывается, я не могу импортировать django-messages 'представления тогда, так как

from messages.views import inbox

внутри urls/messages.py пытается сначала импортировать из локального каталога, находит модуль messages, но не может импортироватьmessages.views тогда, поскольку urls/messages/views.py явно отсутствует.Мне бы не хотелось переименовывать мои модули во что-то вроде urls.messages_urls, но я не нашел способа явно указать Python импортировать «другие» messages.views.Также я не хотел бы указывать свои импортированные представления через строки, даже если я могу сделать это в Django.

Как мне решить эту ситуацию чисто?

Ответы [ 3 ]

2 голосов
/ 08 июля 2011

Это неправильный способ сделать это.

В Django есть метод для разделения urls.py на отдельные файлы, который должен использовать include(). Сохраните URL-адреса для каждого приложения в своем собственном urls.py и включите их в основное.

2 голосов
/ 31 марта 2012

Для тех, кто не смог его найти, я столкнулся с неоднозначными ошибками импорта.Например, в проекте django, скажем, у меня есть это дерево:

  • налоговый модуль
    • модуль моделей
      • init .py
      • tax.py
      • foo.py

In init .py, Iхочу импортировать tax.models.tax.Tax.Поэтому я пишу:

from tax.models.tax import Tax

Но python не находит правильный импорт (он ищет модели внутри tax.models) и выдает

ImportError: No module named models

Вы действительно поняли, что это все оотносительный импорт.Python сначала смотрит в текущий модуль.Если первая часть вашего импорта существует в текущем модуле, она завершится неудачно.Это поведение было исправлено в Python 2.5 (и могло стать по умолчанию в Python 3.0), вам просто нужно добавить:

from __future__ import absolute_import

перед вашим абсолютным импортом.Взгляните на В Python 2.5 представлен абсолютный импорт для получения более полной информации.

1 голос
/ 08 июля 2011

Вы пробовали:

from django.contrib.messages.views import inbox

Не проверено, но я думаю, что полный импорт будет работать как положено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...