Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 18, 2008 19:47:31

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

Вобщем дело такое, есть модуль, в котором определена функция, он импортит функцию из другого модуля, которая импортит третий модуль, который импортит функцию из первого модуля с ошибкой:
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)

Офлайн

#2 Апрель 18, 2008 19:58:59

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

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 - он уже частично есть в виде обьекта в памяти.
Но так как до определения функции дело не дошло при прошлом импорте - вот он в этом объекте ее и не находит.



Отредактировано (Апрель 18, 2008 20:02:17)

Офлайн

#3 Апрель 18, 2008 20:09:51

slivlen
От:
Зарегистрирован: 2006-07-06
Сообщения: 764
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

cybergrind
Не пакуй файлы раром , не у всех есть чем его распаковать. =)



Офлайн

#4 Апрель 18, 2008 20:18:57

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

2slivlen: ок, извиняюсь что сразу не сообразил, я почемуто думал что рар под линуксом не редкость =)

2shiza: в принципе я понимаю в чем проблема, но мне интересно, может кто знает еще какие пути решения



Офлайн

#5 Апрель 18, 2008 20:22:25

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

Я бы архитектуру поменял, а то запутатся можно - кто кого импортирует %)

Например вынес функцию из первого модуля в отдельный модуль… или типа того.



Офлайн

#6 Апрель 18, 2008 20:39:29

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

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

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

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



собственно архитектурные вопросы я представляю с какой стороны решать, но может есть еще варианты?



Отредактировано (Апрель 18, 2008 20:40:32)

Офлайн

#7 Апрель 18, 2008 23:54:50

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

import Error

Не пакуй файлы раром , не у всех есть чем его распаковать
7z поддерживает rar, ну и мультиплатформенный.

Офлайн

#8 Апрель 19, 2008 01:49:54

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

import Error

единственное, что приходит в голову:

module3

def module3function():
from module1 import function1

function1()



Офлайн

#9 Апрель 19, 2008 16:46:25

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

import Error

cybergrind
или в модуле3 спрятать импорт модуля1
чтото типа этого. а это нормальная практика?



Офлайн

#10 Апрель 19, 2008 19:32:16

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

import Error

Иногда - приходится



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version