Найти - Пользователи
Полная версия: Рекурсивный импорт (Circular Imports)
Начало » Python для новичков » Рекурсивный импорт (Circular Imports)
1
necrozyablo
Стандартная проблема новичка наверное уже разжёвывалась несколько раз, но почему то не могу найти вменяемого понятного ответа.

Вот есть код

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

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

Я не получу тот же самый
ImportError: cannot import name B?
Андрей Светлов
Конечно получите. А вы часто так пишете?
necrozyablo
Андрей Светлов
Конечно получите. А вы часто так пишете?
Да нет, я просто пытаюсь понять как правильно строить структуру.
Андрей Светлов
Лучше - вообще без рекурсии.
Такое легче поддерживать и развивать.
Ну там OOA/OOD, слабо связанне подсистемы и все такое прочее.
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