Импорт, ведущий к круговой зависимости

В Python инструкция import также является исполняемым оператором. Каждый вызов инструкции import приводит к выполнению соответствующего модуля. Кроме того, любая функция или класс из модуля модуле не может быть выполнена до тех пор, пока соответствующий код (в функции или классе) не будет запущен.

Следовательно, импортируемый модуль может рекурсивно может вызвать циклическую зависимость в коде. Например, предположим, есть два модуля Mod1 и Mod2.

В Mod1 есть import для загрузки Mod2:
Круговая зависимость

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

1. Mod1 загружается из основной программы. Основная программа читает и обрабатывает mod1. Так как в начале этого модуля загружается mod2 , так что Python читает его следующим.

2. До этого момента у Python есть mod1 и mod 2 в списке объектов sys.modules . Но mod1 до сих пор не получил какого-либо определения, потому что Python в настоящее время выполняет модуль mod>.

3. Теперь, чтобы создать круговую зависимость, добавим оператор “import mod1” в модуль mod2. Таким образом, к моменту выполнения import mod1, Python будет ссылаться о на пустой объект Mod1.

4. В этой ситуации любое обращение к объектам mod1(функций или классов) из mod2 приведет к ошибке.

Круговая зависимость

Решение.

Два наиболее очевидных способа решить эту проблему:
1. Изменить программу для устранения рекурсивного импорта. Можно переместить некоторые функциональные возможности в новый модуля.

2. Второй способ – переместить import mod2 в конец вызываемого модуля, т.е. mod1. Таким образом, перемещение import mod2 к EOF в модуле mod1 решит проблему круговой зависимости

Поделитесь с друзьями:

Оставьте комментарий