Пользовательское исключение Python с различными путями включения - PullRequest
1 голос
/ 30 июня 2009

Обновление: Это, как мне сказали, не принципиальная проблема, связанная с 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',
]

решил проблему.

Ответы [ 4 ]

1 голос
/ 30 июня 2009

«Если нет, то что было бы лучше всего избегать этих именных столкновений?»

Это полностью зависит от того, почему они происходят. При обычной установке вы не можете импортировать как из application.exceptions, так и somepath.application.exceptions, если только первый случай не является относительным путем из модуля somepath. И в этом случае Python поймет, что модули одинаковы, и у вас не возникнет проблем.

Вам неясно, действительно ли у вас есть проблема или это теория. Если у вас есть проблемы, я думаю, что с вашим PYTHONPATH есть что-то подозрительное. Может быть, каталог и его подкаталог находятся в PATH?

1 голос
/ 30 июня 2009

Почему это было бы проблемой? Исключение будет совпадать на основе типа класса, и оно будет таким же, однако оно импортируется, например,

import exceptions
l=[]
try:
    l[1]
except exceptions.IndexError,e:
    print e

try:
    l[1]
except IndexError,e:
    print e

оба ловят одно и то же исключение

вы даже можете присвоить его новому имени, хотя обычно это не рекомендуется

import os
os.myerror = exceptions.IndexError
try:
    l[1]
except os.myerror,e:
    print e
0 голосов
/ 30 июня 2009

Я не знаю, есть ли способ справиться с этой проблемой пути включения. Я предлагаю использовать ключевое слово «as» в вашем импорте

Что-то вроде:

import some.application.exceptions as my_exceptions

или

import application.exceptions as my_exceptions

0 голосов
/ 30 июня 2009

Даже если один и тот же модуль импортируется несколько раз и разными способами, класс CustomException остается тем же объектом, поэтому не имеет значения, как вы к нему обращаетесь.

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