cybergrind
Апрель 18, 2008 19:47:31
Вобщем дело такое, есть модуль, в котором определена функция, он импортит функцию из другого модуля, которая импортит третий модуль, который импортит функцию из первого модуля с ошибкой:
ImportError: cannot import name function1
Вобщем, как я понимаю, проблема в том, что при импорте в самом первом модуле, в цепочке импортов оказывается надо заимпортить функцию из самого первого модуля. Проблема частично решается если перед импортом первого модуля, делать импорт последнего, но может кто знает решение попроще?
я понимаю, что очень все непонятно объяснил, попробую описать схему:
module1:
import module2
module2:
import module3
module3:
from module1 import function1
может кто сталкивался с такими траблами, т.к. обычно питон все импорты неплохо так и сам разрешает, вот только в этом случае чегото не вышло, а всегда импортить модуль3 перед импортом модуля1 как-то хакнуто выглядит.
P.S. в аттаче пример. что бы увидеть ошибку надо сделать import module1
shiza
Апрель 18, 2008 19:58:59
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
Мое имхо такое:
На момент повторного импорта модуля 1 - он уже частично есть в виде обьекта в памяти.
Но так как до определения функции дело не дошло при прошлом импорте - вот он в этом объекте ее и не находит.
slivlen
Апрель 18, 2008 20:09:51
cybergrindНе пакуй файлы раром , не у всех есть чем его распаковать. =)
cybergrind
Апрель 18, 2008 20:18:57
2slivlen: ок, извиняюсь что сразу не сообразил, я почемуто думал что рар под линуксом не редкость =)
2shiza: в принципе я понимаю в чем проблема, но мне интересно, может кто знает еще какие пути решения
shiza
Апрель 18, 2008 20:22:25
Я бы архитектуру поменял, а то запутатся можно - кто кого импортирует %)
Например вынес функцию из первого модуля в отдельный модуль… или типа того.
cybergrind
Апрель 18, 2008 20:39:29
вопрос о смене архитектуры не может в данном случае подниматься - т.к. все и так понимают, что архитектуру надо менять, но проект большой, особо недокументированый, сложный и, самое главное, рабочий.
вынести функцию в отдельный модуль тоже нельзя - т.к. функция представляет собой измененную старую функцию, уже использующуюся + являющуюся логически неотъемлимой частью модуля.
единственные архитектурные решение в данном случае, которое я вижу, вынести всю необходимую информацию из модуля3 в отдельный модуль (а на их месте создать прокси-объекты, хотя это и усложнит архитектуру, но не сломает старый функционал), или в модуле3 спрятать импорт модуля1, таким образом, что бы при простом импорте он не импортился (но это нарушает принятый нами пеп8:пункт о том, что все импорты находятся в начале файла)
собственно архитектурные вопросы я представляю с какой стороны решать, но может есть еще варианты?
Ferroman
Апрель 18, 2008 23:54:50
Не пакуй файлы раром , не у всех есть чем его распаковать
7z поддерживает rar, ну и мультиплатформенный.
Андрей Светлов
Апрель 19, 2008 01:49:54
единственное, что приходит в голову:
module3
def module3function():
from module1 import function1
function1()
cybergrind
Апрель 19, 2008 16:46:25
cybergrind
или в модуле3 спрятать импорт модуля1
чтото типа этого. а это нормальная практика?
Андрей Светлов
Апрель 19, 2008 19:32:16
Иногда - приходится