Как импортировать из пакета уровня проекта в Django, не конфликтуя с модулем уровня приложения с тем же именем? - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть проект Django (Python 2.7.15) со следующей структурой:

mysite/
    manage.py
    mysite/
        __init__.py
        settings.py
        urls.py
        wsgi.py
    polls/
        __init__.py
        admin.py
        apps.py
        migrations/
            __init__.py
        models.py
        tests.py
        views.py
        utils.py
    utils/
        __init__.py
        filters.py

В моем файле utils/filters.py есть класс MyFilter. Однако с polls/admin.py, когда я пытаюсь запустить from utils.filters import MyFilter, я получаю ImportError: No module named filters. Как я могу импортировать свой пользовательский фильтр внутри приложения опросов, не переименовывая модуль polls/utils.py или пакет utils?

ПРИМЕЧАНИЕ. Это не проблема кругового импорта. Это происходит, даже если я ничего не импортирую из utils/filters.py. Это конфликт имен между utils/ и polls/utils.py. Python пытается найти filters.MyFilter внутри polls/utils.py и не находит его, поэтому выдает ошибку. Я просто хочу найти способ обойти этот конфликт и заставить python искать filters.MyFilter внутри пакета utils/ в корне проекта.

1 Ответ

0 голосов
/ 04 сентября 2018

В Python 2 import utils является неоднозначным, потому что это может быть относительный или абсолютный импорт.

Если вы включите поведение Python 3, добавив следующий импорт в начало вашего модуля,

from __future__ import absolute_import

, тогда from utils.filters import MyFilter будет рассматриваться как абсолютный импорт и будет работать.

Как только вы добавите будущий импорт, вам нужно будет использовать явный относительный импорт import .utils, если вы хотите импортировать polls/utils.py из polls/admin.py.

...