Форум сайта python.su
Вобщем дело такое, есть модуль, в котором определена функция, он импортит функцию из другого модуля, которая импортит третий модуль, который импортит функцию из первого модуля с ошибкой:
ImportError: cannot import name function1
Вобщем, как я понимаю, проблема в том, что при импорте в самом первом модуле, в цепочке импортов оказывается надо заимпортить функцию из самого первого модуля. Проблема частично решается если перед импортом первого модуля, делать импорт последнего, но может кто знает решение попроще?
я понимаю, что очень все непонятно объяснил, попробую описать схему:
module1:
import module2
module2:
import module3
module3:
from module1 import function1
может кто сталкивался с такими траблами, т.к. обычно питон все импорты неплохо так и сам разрешает, вот только в этом случае чегото не вышло, а всегда импортить модуль3 перед импортом модуля1 как-то хакнуто выглядит.
P.S. в аттаче пример. что бы увидеть ошибку надо сделать import module1
Отредактировано (Апрель 18, 2008 20:17:39)
Офлайн
traceback:
Traceback (most recent call last):
File "C:\tmp1\\module3.py", line 1, in <module>
from module1 import function1
File "C:\tmp1\module1.py", line 1, in <module>
import module2
File "C:\tmp1\module2.py", line 1, in <module>
import module3
File "C:\tmp1\module3.py", line 1, in <module>
from module1 import function1
ImportError: cannot import name function1
Отредактировано (Апрель 18, 2008 20:02:17)
Офлайн
cybergrind
Не пакуй файлы раром , не у всех есть чем его распаковать. =)
Офлайн
2slivlen: ок, извиняюсь что сразу не сообразил, я почемуто думал что рар под линуксом не редкость =)
2shiza: в принципе я понимаю в чем проблема, но мне интересно, может кто знает еще какие пути решения
Офлайн
Я бы архитектуру поменял, а то запутатся можно - кто кого импортирует %)
Например вынес функцию из первого модуля в отдельный модуль… или типа того.
Офлайн
вопрос о смене архитектуры не может в данном случае подниматься - т.к. все и так понимают, что архитектуру надо менять, но проект большой, особо недокументированый, сложный и, самое главное, рабочий.
вынести функцию в отдельный модуль тоже нельзя - т.к. функция представляет собой измененную старую функцию, уже использующуюся + являющуюся логически неотъемлимой частью модуля.
единственные архитектурные решение в данном случае, которое я вижу, вынести всю необходимую информацию из модуля3 в отдельный модуль (а на их месте создать прокси-объекты, хотя это и усложнит архитектуру, но не сломает старый функционал), или в модуле3 спрятать импорт модуля1, таким образом, что бы при простом импорте он не импортился (но это нарушает принятый нами пеп8:пункт о том, что все импорты находятся в начале файла)
собственно архитектурные вопросы я представляю с какой стороны решать, но может есть еще варианты?
Отредактировано (Апрель 18, 2008 20:40:32)
Офлайн
Не пакуй файлы раром , не у всех есть чем его распаковать7z поддерживает rar, ну и мультиплатформенный.
Офлайн
единственное, что приходит в голову:
module3
def module3function():
from module1 import function1
function1()
Офлайн
cybergrindчтото типа этого. а это нормальная практика?
или в модуле3 спрятать импорт модуля1
Офлайн
Иногда - приходится
Офлайн