Найти - Пользователи
Полная версия: import Error
Начало » Python для экспертов » import Error
1
cybergrind
Вобщем дело такое, есть модуль, в котором определена функция, он импортит функцию из другого модуля, которая импортит третий модуль, который импортит функцию из первого модуля с ошибкой:
ImportError: cannot import name function1

Вобщем, как я понимаю, проблема в том, что при импорте в самом первом модуле, в цепочке импортов оказывается надо заимпортить функцию из самого первого модуля. Проблема частично решается если перед импортом первого модуля, делать импорт последнего, но может кто знает решение попроще?

я понимаю, что очень все непонятно объяснил, попробую описать схему:

module1:
import module2

module2:
import module3

module3:
from module1 import function1


может кто сталкивался с такими траблами, т.к. обычно питон все импорты неплохо так и сам разрешает, вот только в этом случае чегото не вышло, а всегда импортить модуль3 перед импортом модуля1 как-то хакнуто выглядит.

P.S. в аттаче пример. что бы увидеть ошибку надо сделать import module1
shiza
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
cybergrind
Не пакуй файлы раром , не у всех есть чем его распаковать. =)
cybergrind
2slivlen: ок, извиняюсь что сразу не сообразил, я почемуто думал что рар под линуксом не редкость =)

2shiza: в принципе я понимаю в чем проблема, но мне интересно, может кто знает еще какие пути решения
shiza
Я бы архитектуру поменял, а то запутатся можно - кто кого импортирует %)

Например вынес функцию из первого модуля в отдельный модуль… или типа того.
cybergrind
вопрос о смене архитектуры не может в данном случае подниматься - т.к. все и так понимают, что архитектуру надо менять, но проект большой, особо недокументированый, сложный и, самое главное, рабочий.

вынести функцию в отдельный модуль тоже нельзя - т.к. функция представляет собой измененную старую функцию, уже использующуюся + являющуюся логически неотъемлимой частью модуля.

единственные архитектурные решение в данном случае, которое я вижу, вынести всю необходимую информацию из модуля3 в отдельный модуль (а на их месте создать прокси-объекты, хотя это и усложнит архитектуру, но не сломает старый функционал), или в модуле3 спрятать импорт модуля1, таким образом, что бы при простом импорте он не импортился (но это нарушает принятый нами пеп8:пункт о том, что все импорты находятся в начале файла)



собственно архитектурные вопросы я представляю с какой стороны решать, но может есть еще варианты?
Ferroman
Не пакуй файлы раром , не у всех есть чем его распаковать
7z поддерживает rar, ну и мультиплатформенный.
Андрей Светлов
единственное, что приходит в голову:

module3
def module3function():
from module1 import function1

function1()
cybergrind
cybergrind
или в модуле3 спрятать импорт модуля1
чтото типа этого. а это нормальная практика?
Андрей Светлов
Иногда - приходится
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB