Кеш модуля

Оновлено: 28.04.2023

Перше місце, яке перевіряється під час пошуку імпорту, це sys.modules. Це відображення служить кеш-пам’яттю всіх модулів, які були раніше імпортовані, включаючи проміжні шляхи. Отже, якщо foo.bar.baz був раніше імпортований, sys.modules міститиме записи для foo, foo.bar і foo.bar.baz. Кожен ключ матиме значення відповідного об’єкта модуля.

Під час імпорту ім’я модуля шукається в sys.modules і, якщо воно присутнє, пов’язане значення означає модуль, який задовольняє імпорт, і процес завершується. Однак, якщо значенням є None, тоді виникає ModuleNotFoundError. Якщо ім’я модуля відсутнє, Python продовжить пошук модуля.

sys.modules доступний для запису. Видалення ключа може не знищити пов’язаний модуль (оскільки інші модулі можуть містити посилання на нього), але це зробить недійсним запис кешу для названого модуля, змусивши Python знову шукати названий модуль під час наступного імпорту. Ключ також може бути призначений як None, змушуючи наступний імпорт модуля призводити до ModuleNotFoundError.

Але будьте обережні: якби ви зберегли посилання на об’єкт модуля, зробили недійсним запис кешу в sys.modules, а потім повторно імпортували названий модуль, два об’єкти модуля не будуть однаковими. Навпаки, importlib.reload() повторно використовуватиме той самий об’єкт модуля та просто повторно ініціалізує вміст модуля, повторно запускаючи код модуля.