Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2010 00:55:30

necrozyablo
От:
Зарегистрирован: 2010-05-03
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный импорт (Circular Imports)

Стандартная проблема новичка наверное уже разжёвывалась несколько раз, но почему то не могу найти вменяемого понятного ответа.

Вот есть код

файл test.py

from test2 import testus2

class testus1:

def __init__(self):
self.x=10

def run(self):
self.x *=10
print self.x


x = testus1()
x.run()
файл test2.py

from test import testus1

class testus2(testus1):

def __init__(self):

self.x=10

def run(self):
self.x *=10
Собственно при запуске test.py получим ошибку
ImportError: cannot import name testus2

Не может он его заимпортить из-за того что начинается бесконечная рекурсия импорта.
Вообще как решать эту проблему?
По сабжу начал разносить код по разным файлам, в файлах с детьми не виден parent и импортировать его тоже не могу из-за того что начинается рекурсия т.к в parent есть импорт детей.



Офлайн

#2 Май 16, 2010 01:08:13

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный импорт (Circular Imports)

по-моему, это архитектурная ошибка, просто незачем так делать



Офлайн

#3 Май 16, 2010 03:14:44

necrozyablo
От:
Зарегистрирован: 2010-05-03
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный импорт (Circular Imports)

pasaranax
по-моему, это архитектурная ошибка, просто незачем так делать
Мне просто сложно понять почему если я всё держу в одном файле я могу так делать, а если я хочу разнести код по файлам то мне нужен жёсткий рефакторинг.

Я как понимаю исходя из того что мне в любом случае надо из детей делать импорт parent (для того чтобы в области переменных появился оный parent и я смог таковым его указать) то значит мне из parent класса ни при каких обстоятельствах нельзя импортировать child?



Отредактировано (Май 16, 2010 03:18:40)

Офлайн

#4 Май 16, 2010 09:39:34

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

Рекурсивный импорт (Circular Imports)

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

module a

class A(object):
def __init__(self):
from b import B
self.class_B = B
def f(self):
return self.class_B()
module b
from a import A

class B(A):
pass
Запоминание класса в конструкторе - полезная вещь. import довольно закладная операция.



Офлайн

#5 Май 16, 2010 17:34:54

necrozyablo
От:
Зарегистрирован: 2010-05-03
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный импорт (Circular Imports)

Андрей Светлов
Не хочется разжевывать, почему сильные зависимости - далеко не всегда хорошо. И как эту проблему решают интерфейсы и фабрики…
И тем не менее циклические импорты иногда бывают нужны.
Самый, наверное, простой способ: вспоминаем, что import можно делать еще и из функции.
Нет ну такой вариант мне понятен, но разве если я допишу в module a в конец
c = A()
c.f

Я не получу тот же самый
ImportError: cannot import name B?



Офлайн

#6 Май 17, 2010 09:46:43

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

Рекурсивный импорт (Circular Imports)

Конечно получите. А вы часто так пишете?



Офлайн

#7 Май 17, 2010 10:26:35

necrozyablo
От:
Зарегистрирован: 2010-05-03
Сообщения: 24
Репутация: +  0  -
Профиль   Отправить e-mail  

Рекурсивный импорт (Circular Imports)

Андрей Светлов
Конечно получите. А вы часто так пишете?
Да нет, я просто пытаюсь понять как правильно строить структуру.



Офлайн

#8 Май 17, 2010 12:09:58

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

Рекурсивный импорт (Circular Imports)

Лучше - вообще без рекурсии.
Такое легче поддерживать и развивать.
Ну там OOA/OOD, слабо связанне подсистемы и все такое прочее.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version