Объясните, как устроен импорт в Python: роль sys.modules (кэш), цепочка sys.meta_path/finders/ModuleSpec/loaders, что происходит при циклических зависимостях, и почему importlib.reload() не «обновляет» ссылки в других модулях.
При import сначала проверяется sys.modules; если модуля нет, по sys.meta_path ищут spec, создают объект модуля, сразу кладут его в sys.modules (для разрыва циклов) и затем loader.exec_module() исполняет код. В циклическом импорте второй участник видит частично инициализированный модуль (атрибутов ещё нет) → AttributeError/тонкие баги. Помогает отложить импорт внутрь функций/блоков, импортировать модуль целиком вместо from X import Y. reload() переисполнить код в том же объекте модуля: старые ссылки в других модулях остаются на прежние объекты, состояние/сайд-эффекты не откатываются — безопасно только при продуманном, идемпотентном коде и контроле точек связывания. Для кастомных источников добавляют свои finders/ loaders в sys.meta_path; namespace-пакеты работают по PEP 420 без __init__.py.
Библиотека собеса по Python
Post #1421
499