Меташлях

Оновлено: 28.04.2023

Якщо вказаний модуль не знайдено в sys.modules, Python далі шукає sys.meta_path, який містить список об’єктів пошуку мета-шляху. Ці шукачі запитуються, щоб побачити, чи знають вони, як працювати з названим модулем. Шукачі меташляхів повинні реалізувати метод під назвою find_spec(), який приймає три аргументи: ім’я, шлях імпорту та (необов’язково) цільовий модуль. Шукач меташляху може використовувати будь-яку стратегію, щоб визначити, чи може він обробляти названий модуль чи ні.

Якщо засіб пошуку меташляху знає, як обробляти названий модуль, він повертає специфікаційний об’єкт. Якщо він не може обробити названий модуль, він повертає None. Якщо обробка sys.meta_path досягає кінця свого списку без повернення специфікації, тоді виникає ModuleNotFoundError. Будь-які інші викликані винятки просто поширюються, перериваючи процес імпорту.

Метод find_spec() засобів пошуку меташляху викликається з двома або трьома аргументами. Перше — це повна назва модуля, який імпортується, наприклад foo.bar.baz. Другим аргументом є записи шляху, які слід використовувати для пошуку модулів. Для модулів верхнього рівня другим аргументом є None, але для підмодулів або підпакетів другим аргументом є значення атрибута __path__ батьківського пакета. Якщо неможливо отримати доступ до відповідного атрибута __path__, виникає ModuleNotFoundError. Третій аргумент — це існуючий об’єкт модуля, який буде метою завантаження пізніше. Система імпорту передає цільовий модуль лише під час перезавантаження.

Мета-шлях може проходити кілька разів для одного запиту на імпорт. Наприклад, якщо припустити, що жоден із задіяних модулів уже не кешовано, імпорт foo.bar.baz спочатку виконає імпорт верхнього рівня, викликаючи mpf.find_spec("foo", None, None) на шукач кожного меташляху (mpf). Після того, як foo було імпортовано, foo.bar буде імпортовано шляхом проходження меташляху вдруге, викликавши mpf.find_spec("foo.bar", foo.__path__, None) . Після того, як foo.bar буде імпортовано, остаточний обхід викличе mpf.find_spec("foo.bar.baz", foo.bar.__path__, None).

Деякі засоби пошуку меташляхів підтримують лише імпорт верхнього рівня. Ці імпортери завжди повертатимуть None, якщо будь-що інше, ніж None, передається як другий аргумент.

За замовчуванням sys.meta_path Python має три засоби пошуку меташляху: один, який знає, як імпортувати вбудовані модулі, інший, який знає, як імпортувати заморожені модулі, і інший, який знає, як імпортувати модулі зі шляху імпорту (import path, тобто path based finder).