Выбор ответа Middle Модули, пакеты и окружения спрашивают часто обновлено

Циклический импорт и from-импорт

Вопрос

a.py начинается с from b import helper, а b.py с from a import CONFIG (CONFIG объявлен в a ниже импорта). Что будет при import a?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ImportError: a ещё не выполнен, CONFIG в нём нет. Python кладёт a в sys.modules до выполнения его кода.

Варианты ответа

  1. Бесконечная рекурсия импортов и RecursionError
  2. ImportError: a ещё не выполнен, CONFIG в нём нетправильный ответ
  3. Всё сработает: Python сам упорядочит импорт модулей
  4. SyntaxError при компиляции из-за цикла импортов

Разбор

Python кладёт a в sys.modules до выполнения его кода. Затем a импортирует b, а b пытается взять CONFIG из ещё не выполненного a и получает ImportError: cannot import name ... (most likely due to a circular import). Бесконечной рекурсии нет как раз благодаря sys.modules. Лечат выносом общего в третий модуль или поздним импортом.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме