Обновление: Это, как мне сказали, не принципиальная проблема, связанная с Python, но, похоже, более конкретная. Ниже приведены подробные объяснения моей проблемы.
У меня есть пользовательское исключение (назовем его CustomException
), которое находится в файле с именем exceptions.py
. Теперь представьте, что я могу импортировать этот файл двумя путями:
import application.exceptions
или
import some.application.exceptions
с тем же результатом. Кроме того, я не могу контролировать, каким образом модуль импортируется в другие модули.
Теперь, чтобы показать мою проблему: предположим, что функция do_something
происходит из другого модуля, который импортирует файл exceptions.py, который я не знаю. Если я сделаю это:
import application.exceptions
try:
do_something ()
except application.exceptions.CustomException:
catch_me ()
это может работать или нет, в зависимости от того, как субмодуль импортировал exceptions.py
(чего я не знаю).
Вопрос: Есть ли способ обойти эту проблему, т. Е. Имя исключения, которое всегда будет пониматься независимо от пути включения? Если нет, что было бы лучше, чтобы избежать столкновения имен?
Приветствия
Обновление
Это приложение Django. some
будет именем Django 'project', application
именем одного приложения Django. Мой код с предложением try..except находится в другом приложении, frontend
, и живет там как представление в файле some/frontend/views.py
.
PYTHONPATH чист, то есть из моего проекта только /path/to/project
находится на пути. В frontend/views.py
я импортирую файл exceptions.py через import application.exceptions
, который, кажется, работает. (Теперь, ретроспективно, я точно не знаю, почему это работает ...)
Исключение возникает в самом файле exceptions.py
.
Обновление 2
Некоторым читателям может быть интересно, что я наконец нашел место, где импорт пошёл не так.
В sys.path
не было никаких подозрительных нарушений. Мой проект Django лежал в /var/www/django/project
. Я установил приложения app1
и app2
, но отметил их в settings.py как
INSTALLED_APPS = [
'project.app1',
'project.app2',
]
Дополнительный project.
был виновником порчи sys.modules
. Переписав настройки на
INSTALLED_APPS = [
'app1',
'app2',
]
решил проблему.