Форум сайта python.su
Привет.
Есть один главный модуль, и есть другой неглавный, который динамически загружается из главного. В главном модуле объявлено моё исключение, которое может быть вызвано из неглавного модуля. Пролема в том, что это исключение, вызванное в неглавном модуле, не ловится в главном. Вот код:
main.py
class MyException(Exception):
pass
m = __import__('module')
try:
m.func()
except MyException:
print('ops')
from main import MyException
def func():
raise MyException
Отредактировано (Ноя. 5, 2009 12:31:20)
Офлайн
race1У вас по виду циклический импорт. Из main.py импортируется module, а в module.py импортируется нечто из main.
Вот, почему так?
Traceback (most recent call last):
File "main.py", line 4, in <module>
m = __import__('module')
File "/home/ed/tmp/module.py", line 1, in <module>
from main.py import MyException
File "/home/ed/tmp/main.py", line 6, in <module>
m.func()
Офлайн
Кажется там в коде у меня ошибка, надо не from main.py import, а from main import…
Пусть даже и циклический, Питон же с ними справляет неплохо. Может тут что-то, свзанное с __import__?..
Офлайн
Питону по-моему без разницы что там main.py или main. Падает так же. И точно так же падает при замене m = __import__(“module”) на import module as m
Офлайн
Вот, нашел статейку в тему: http://effbot.org/zone/import-confusion.htm
Рекомендую ознакомиться.
Офлайн
Спасибо за статью :)
Вынес своё исключение в отдельный модуль, как и ожидалось, начало работать. Теперь моё исключение это “global_module.MyException”.
Т.е. изначальная проблема в том, что Питон почему-то считает класс К, объявленный в этом модуле, и класс К из этого модуля, но импортированный из другого модуля, двумя разными классами?
Офлайн
Изначальная проблема в том, что у вас циклический импорт.
Кстати, вы могли перенести свое исключение в module - тоже бы сработало, поскольку цикл бы исчез.
Офлайн
Ага, я забыл что сначала главный модуль импортируется как __main__ (т.к. он запускается из командной строки), а потом он импортируется заново из неглавного модуля как main.
Мда, к некоторым особенностям Питона нужно перестраивать мышление… :)
Офлайн