Это круговая зависимость. Это может быть решено без каких-либо структурных изменений в коде. Проблема возникает из-за того, что в vector
вы требуете, чтобы entity
был сделан доступным для использования немедленно, и наоборот. Причиной этой проблемы является то, что вы запрашиваете доступ к содержимому модуля до его готовности - с помощью from x import y
. По сути это то же самое, что и
import x
y = x.y
del x
Python способен обнаруживать циклические зависимости и предотвращать бесконечный цикл импорта. По сути, все, что происходит, - это то, что для модуля создается пустой заполнитель (т. Е. У него нет содержимого). Как только циклически зависимые модули скомпилированы, он обновляет импортированный модуль. Это работает примерно так.
a = module() # import a
# rest of module
a.update_contents(real_a)
Чтобы Python мог работать с циклическими зависимостями, вы должны использовать только стиль import x
.
import x
class cls:
def __init__(self):
self.y = x.y
Поскольку вы больше не ссылаетесь на содержимое модуля на верхнем уровне, python может скомпилировать модуль, фактически не имея доступа к содержимому циклической зависимости. Под верхним уровнем я подразумеваю строки, которые будут выполняться во время компиляции, а не содержимое функций (например, y = x.y
). Статические или классовые переменные, обращающиеся к содержимому модуля, также вызовут проблемы.