Документация Python неофициальный перевод
Содержание страницы

30.6. importlib – Реализация importimportlib – The implementation of import

Новое в версии 3.1.

30.6.1. ВведениеIntroduction

Пакет importlib преследует две цели. Первая – предоставить реализацию оператора import (и, соответственно, функции __import__()) на языке Python. Это даёт реализацию import, которая переносима на любой интерпретатор Python. Кроме того, такая реализация легче для понимания, чем реализация на другом языке программирования.

Во-вторых, компоненты, необходимые для реализации import, предоставлены в этом пакете, что упрощает пользователям создание собственных объектов (обобщённо называемых importer) для участия в процессе импорта.

См. также

Оператор import
Справочное руководство по оператору import.
Спецификация пакетов
Оригинальная спецификация пакетов. Некоторые аспекты семантики изменились с момента написания этого документа (например, перенаправление на основе None в sys.modules).
Функция __import__()
Оператор import – это синтаксический сахар для этой функции.
PEP 235
Импорт на платформах, нечувствительных к регистру
PEP 263
Определение кодировок исходного кода Python
PEP 302
Новые хуки импорта
PEP 328
Импорт: многострочный и абсолютный/относительный
PEP 366
Явные относительные импорты в главном модуле
PEP 451
Тип ModuleSpec для системы импорта
PEP 3120
Использование UTF-8 в качестве кодировки исходного кода по умолчанию
PEP 3147
Каталоги репозитория PYC

30.6.2. ФункцииFunctions

importlib.__import__(name, globals=None, locals=None, fromlist=(), level=0)

Реализация встроенной функции __import__().

importlib.import_module(name, package=None)

Импортирует модуль. Аргумент name задаёт импортируемый модуль в абсолютном или относительном виде (например, pkg.mod или ..mod). Если имя указано в относительной форме, то аргумент package должен быть задан как имя пакета, который будет служить точкой привязки для разрешения имени пакета (например, import_module('..mod', 'pkg.subpkg') импортирует pkg.mod).

Функция import_module() является упрощающей обёрткой вокруг importlib.__import__(). Это означает, что вся семантика функции наследуется от importlib.__import__(), включая требование, чтобы пакет, из которого происходит импорт, был ранее импортирован (т.е. package уже должен быть импортирован). Наиболее важное отличие состоит в том, что import_module() возвращает указанный пакет или модуль (например, pkg.mod), тогда как __import__() возвращает пакет или модуль верхнего уровня (например, pkg).

Изменено в версии 3.3: Родительские пакеты импортируются автоматически.

importlib.find_loader(name, path=None)

Находит загрузчик для модуля, возможно, в пределах указанного path. Если модуль находится в sys.modules, то sys.modules[name].__loader__ возвращается (если только загрузчик не равен None, в этом случае возбуждается ValueError). В противном случае выполняется поиск с помощью sys.meta_path. None возвращается, если загрузчик не найден.

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

importlib.invalidate_caches()

Сбрасывает внутренние кеши finder'ов, хранящиеся в sys.meta_path. Если finder реализует invalidate_caches(), то он будет вызван для выполнения сброса. Эту функцию следует вызывать, если во время работы программы создаются или устанавливаются модули, чтобы гарантировать, что все finder'ы заметят существование нового модуля.

Новое в версии 3.3.

30.6.3. importlib.abc – Абстрактные базовые классы, связанные с импортомimportlib.abc – Abstract base classes related to import

Модуль importlib.abc содержит все основные абстрактные базовые классы, используемые import. Также предоставляются некоторые подклассы основных абстрактных базовых классов для помощи в реализации базовых ABC.

Иерархия ABC:

object
 +-- Finder (deprecated)
 |    +-- MetaPathFinder
 |    +-- PathEntryFinder
 +-- Loader
      +-- ResourceLoader --------+
      +-- InspectLoader          |
           +-- ExecutionLoader --+
                                 +-- FileLoader
                                 +-- SourceLoader
                                      +-- PyLoader (deprecated)
                                      +-- PyPycLoader (deprecated)
class importlib.abc.Finder

Абстрактный базовый класс, представляющий искатель.

Устарело с версии 3.3: Вместо этого используйте MetaPathFinder или PathEntryFinder.

find_module(fullname, path=None)

Абстрактный метод для поиска загрузчика для указанного модуля. Изначально описан в PEP 302, этот метод предназначался для использования в sys.meta_path и в подсистеме импорта на основе путей.

class importlib.abc.MetaPathFinder

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

Новое в версии 3.3.

find_module(fullname, path)

Абстрактный метод для поиска загрузчика для указанного модуля. Если это импорт верхнего уровня, path будет None. В противном случае это поиск подпакета или модуля, и path будет значением __path__ из родительского пакета. Если загрузчик не найден, возвращается None.

invalidate_caches()

Необязательный метод, который при вызове должен аннулировать любой внутренний кеш, используемый искателем. Используется importlib.invalidate_caches() при аннулировании кешей всех искателей на sys.meta_path.

class importlib.abc.PathEntryFinder

Абстрактный базовый класс, представляющий искатель по элементам пути. Хотя он имеет некоторое сходство с MetaPathFinder, PathEntryFinder предназначен для использования только в подсистеме импорта на основе путей, предоставляемой PathFinder. Этот ABC является подклассом Finder для совместимости.

Новое в версии 3.3.

find_loader(fullname)

Абстрактный метод для поиска загрузчика для указанного модуля. Возвращает кортеж из двух элементов (loader, portion), где portion – последовательность местоположений в файловой системе, которые входят в часть пакета пространства имён. Загрузчик может быть None, при этом portion указывает на вклад этих местоположений в пакет пространства имён. Пустой список для portion означает, что загрузчик не является частью пакета. Если loader равен None и portion является пустым списком, то ни загрузчик, ни местоположение для пакета пространства имён не были найдены (т.е. ничего не найдено для модуля).

find_module(fullname)

Конкретная реализация Finder.find_module(), которая эквивалентна self.find_loader(fullname)[0].

invalidate_caches()

Необязательный метод, который при вызове должен сбрасывать любой внутренний кеш, используемый искателем. Используется PathFinder.invalidate_caches() при сбросе кешей всех кешированных искателей.

class importlib.abc.Loader

Абстрактный базовый класс для загрузчика. См. PEP 302 для точного определения загрузчика.

load_module(fullname)

An abstract method for loading a module. If the module cannot be loaded, ImportError is raised, otherwise the loaded module is returned.

If the requested module already exists in sys.modules, that module should be used and reloaded. Otherwise the loader should create a new module and insert it into sys.modules before any loading begins, to prevent recursion from the import. If the loader inserted a module and the load fails, it must be removed by the loader from sys.modules; modules already in sys.modules before the loader began execution should be left alone. The importlib.util.module_for_loader() decorator handles all of these details.

The loader should set several attributes on the module. (Note that some of these attributes can change when a module is reloaded.)

  • __name__

    Имя модуля.

  • __file__

    Путь к месту хранения данных модуля (не задан для встроенных модулей).

  • __cached__

    Путь к месту, где хранится или должна храниться скомпилированная версия модуля (не задан, если атрибут неуместен).

  • __path__

    Список строк, задающих путь поиска внутри пакета. Этот атрибут не задан для модулей.

  • __package__

    The parent package for the module/package. If the module is top-level then it has a value of the empty string. The importlib.util.set_package() decorator can handle the details for __package__.

  • __loader__

    The loader used to load the module. (This is not set by the built-in import machinery, but it should be set whenever a loader is used.)

module_repr(module)

An abstract method which when implemented calculates and returns the given module’s repr, as a string.

class importlib.abc.ResourceLoader

Абстрактный базовый класс для загрузчика, который реализует опциональный протокол PEP 302 для загрузки произвольных ресурсов из бэкенда хранилища.

get_data(path)

An abstract method to return the bytes for the data located at path. Loaders that have a file-like storage back-end that allows storing arbitrary data can implement this abstract method to give direct access to the data stored. IOError is to be raised if the path cannot be found. The path is expected to be constructed using a module’s __file__ attribute or an item from a package’s __path__.

class importlib.abc.InspectLoader

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

get_code(fullname)

An abstract method to return the code object for a module. None is returned if the module does not have a code object (e.g. built-in module). ImportError is raised if loader cannot find the requested module.

get_source(fullname)

Абстрактный метод, возвращающий исходный код модуля. Он возвращается в виде текстовой строки с использованием универсальных символов новой строки, преобразуя все распознаваемые разделители строк в символы '\n'. Возвращает None, если исходный код недоступен (например, для встроенного модуля). Вызывает ImportError, если загрузчик не может найти указанный модуль.

is_package(fullname)

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

class importlib.abc.ExecutionLoader

Абстрактный базовый класс, наследующий от InspectLoader, который при реализации помогает выполнять модуль как скрипт. Этот ABC представляет необязательный протокол PEP 302.

get_filename(fullname)

An abstract method that is to return the value of __file__ for the specified module. If no path is available, ImportError is raised.

Если исходный код доступен, метод должен возвращать путь к файлу исходного кода, независимо от того, использовался ли байткод для загрузки модуля.

class importlib.abc.FileLoader(fullname, path)

Абстрактный базовый класс, наследующий от ResourceLoader и ExecutionLoader, предоставляющий конкретные реализации методов ResourceLoader.get_data() и ExecutionLoader.get_filename().

Аргумент fullname – это полное разрешённое имя модуля, который должен обрабатывать загрузчик. Аргумент path – путь к файлу модуля.

Новое в версии 3.3.

name

Имя модуля, который может обрабатывать загрузчик.

path

Путь к файлу модуля.

load_module(fullname)

Вызывает load_module() родительского класса.

get_filename(fullname)

Возвращает path.

get_data(path)

Returns the open, binary file for path.

class importlib.abc.SourceLoader

Абстрактный базовый класс для реализации загрузки исходных (и, опционально, байт-кодовых) файлов. Этот класс наследует как от ResourceLoader, так и от ExecutionLoader, требуя реализации следующих методов:

Абстрактные методы, определённые в этом классе, предназначены для добавления необязательной поддержки файлов байткода. Если не реализовывать эти необязательные методы, загрузчик сможет работать только с исходным кодом. Реализация методов позволяет загрузчику работать с файлами исходного кода и байткода; но он не поддерживает загрузку без исходного кода, когда предоставляется только байткод. Файлы байткода являются оптимизацией, ускоряющей загрузку за счёт исключения этапа разбора компилятором Python, и поэтому никакой специфичный для байткода API не предоставляется.

path_stats(path)

Необязательный абстрактный метод, возвращающий dict, содержащий метаданные о указанном пути. Поддерживаемые ключи словаря:

  • 'mtime' (обязательно): целое число или число с плавающей точкой, представляющее время изменения исходного кода;
  • 'size' (необязательно): размер исходного кода в байтах.

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

Новое в версии 3.3.

path_mtime(path)

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

Устарело с версии 3.3: Этот метод устарел в пользу path_stats(). Его можно не реализовывать, но он всё ещё доступен для целей обратной совместимости.

set_data(path, data)

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

Если запись по пути не удаётся, потому что путь доступен только для чтения (errno.EACCES/PermissionError), не распространяйте исключение.

get_code(fullname)

Конкретная реализация метода InspectLoader.get_code().

load_module(fullname)

Конкретная реализация метода Loader.load_module().

get_source(fullname)

Конкретная реализация метода InspectLoader.get_source().

is_package(fullname)

Конкретная реализация метода InspectLoader.is_package(). Модуль считается пакетом, если его путь к файлу (как указано в ExecutionLoader.get_filename()) является файлом с именем __init__ после удаления расширения файла и имя самого модуля не заканчивается на __init__.

class importlib.abc.PyLoader

Абстрактный базовый класс, наследующий от ExecutionLoader и ResourceLoader, предназначенный для упрощения загрузки модулей на Python (байткод не обрабатывается; см. SourceLoader для ABC исходного кода/байткода). Подкласс, реализующий этот ABC, должен заботиться только о том, как хранится исходный код; все остальные детали загрузки исходного кода Python будут обрабатываться конкретными реализациями ключевых методов.

Устарело с версии 3.2: Этот класс устарел в пользу SourceLoader и запланирован к удалению в Python 3.4. См. ниже, как создать подкласс, совместимый с Python 3.1 и выше.

Если требуется совместимость с Python 3.1, используйте следующий подход для реализации подкласса, который будет работать с Python 3.1 и выше (обязательно реализуйте ExecutionLoader.get_filename()):

try:
    from importlib.abc import SourceLoader
except ImportError:
    from importlib.abc import PyLoader as SourceLoader


class CustomLoader(SourceLoader):
    def get_filename(self, fullname):
        """Возвращает путь к исходному файлу."""
        # Реализует ...

    def source_path(self, fullname):
        """Реализует source_path с помощью get_filename."""
        try:
            return self.get_filename(fullname)
        except ImportError:
            return None

    def is_package(self, fullname):
        """Реализовать is_package путём поиска файла __init__
        имя, возвращаемое get_filename."""
        filename = os.path.basename(self.get_filename(fullname))
        return os.path.splitext(filename)[0] == '__init__'
source_path(fullname)

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

get_filename(fullname)

Конкретная реализация importlib.abc.ExecutionLoader.get_filename(), которая опирается на source_path(). Если source_path() возвращает None, то возбуждается ImportError.

load_module(fullname)

Конкретная реализация importlib.abc.Loader.load_module(), которая загружает исходный код Python. Вся необходимая информация поступает из абстрактных методов, требуемых этим ABC. Единственное существенное предположение, которое делает этот метод, заключается в том, что при загрузке пакета __path__ устанавливается в [os.path.dirname(__file__)].

get_code(fullname)

Конкретная реализация importlib.abc.InspectLoader.get_code(), которая создаёт объекты кода из исходного кода Python, запрашивая исходный код (с помощью source_path() и get_data()) и компилируя его с помощью встроенной функции compile().

get_source(fullname)

Конкретная реализация importlib.abc.InspectLoader.get_source(). Использует importlib.abc.ResourceLoader.get_data() и source_path() для получения исходного кода. Он пытается угадать кодировку исходного кода с помощью tokenize.detect_encoding().

class importlib.abc.PyPycLoader

Абстрактный базовый класс, наследующий от PyLoader. Этот ABC предназначен для помощи в создании загрузчиков, поддерживающих как исходный код Python, так и байткод.

Устарело с версии 3.2: Этот класс устарел в пользу SourceLoader и для правильной поддержки PEP 3147. Если требуется совместимость с Python 3.1, реализуйте и SourceLoader, и PyLoader; инструкции о том, как это сделать, включены в документацию для PyLoader. Обратите внимание, что это решение не будет поддерживать загрузку без исходного кода; только загрузку исходного кода и байткода.

Изменено в версии 3.3: Обновлено для разбора (но не использования) нового поля размера исходного кода в файлах байткода при чтении и для корректной записи этого поля при записи.

source_mtime(fullname)

Абстрактный метод, который возвращает время изменения исходного кода указанного модуля. Время изменения должно быть целым числом. Если исходного кода нет, вернуть None. Если модуль не найден, возбуждается ImportError.

bytecode_path(fullname)

Абстрактный метод, который возвращает путь к байткоду указанного модуля, если он существует. Возвращает None, если байткода (пока) нет. Возбуждает ImportError, если загрузчик знает, что не может обработать модуль.

get_filename(fullname)

A concrete implementation of ExecutionLoader.get_filename() that relies on PyLoader.source_path() and bytecode_path(). If source_path() returns a path, then that value is returned. Else if bytecode_path() returns a path, that path will be returned. If a path is not available from both methods, ImportError is raised.

write_bytecode(fullname, bytecode)

An abstract method which has the loader write bytecode for future use. If the bytecode is written, return True. Return False if the bytecode could not be written. This method should not be called if sys.dont_write_bytecode is true. The bytecode argument should be a bytes string or bytes array.

30.6.4. importlib.machinery – Importers and path hooks

Этот модуль содержит различные объекты, которые помогают import находить и загружать модули.

importlib.machinery.SOURCE_SUFFIXES

Список строк, представляющих распознаваемые расширения файлов для исходных модулей.

Новое в версии 3.3.

importlib.machinery.DEBUG_BYTECODE_SUFFIXES

Список строк, представляющих расширения файлов для неоптимизированных байт-код модулей.

Новое в версии 3.3.

importlib.machinery.OPTIMIZED_BYTECODE_SUFFIXES

Список строк с расширениями файлов для оптимизированных модулей байткода.

Новое в версии 3.3.

importlib.machinery.BYTECODE_SUFFIXES

Список строк, представляющих распознаваемые расширения файлов для байткод-модулей. Устанавливается в DEBUG_BYTECODE_SUFFIXES или OPTIMIZED_BYTECODE_SUFFIXES в зависимости от того, является ли __debug__ истинным.

Новое в версии 3.3.

importlib.machinery.EXTENSION_SUFFIXES

Список строк с распознаваемыми расширениями файлов для модулей расширений.

Новое в версии 3.3.

importlib.machinery.all_suffixes()

Returns a combined list of strings representing all file suffixes for modules recognized by the standard import machinery. This is a helper for code which simply needs to know if a filesystem path potentially refers to a module without needing any details on the kind of module (for example, inspect.getmodulename())

Новое в версии 3.3.

class importlib.machinery.BuiltinImporter

Импортер для встроенных модулей. Все известные встроенные модули перечислены в sys.builtin_module_names. Этот класс реализует ABC importlib.abc.MetaPathFinder и importlib.abc.InspectLoader.

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

class importlib.machinery.FrozenImporter

Импортер для замороженных модулей. Этот класс реализует ABC importlib.abc.MetaPathFinder и importlib.abc.InspectLoader.

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

class importlib.machinery.WindowsRegistryFinder

Finder для модулей, объявленных в реестре Windows. Этот класс реализует ABC importlib.abc.Finder.

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

Новое в версии 3.3.

class importlib.machinery.PathFinder

Finder для sys.path и атрибутов __path__ пакета. Этот класс реализует ABC importlib.abc.MetaPathFinder.

В этом классе определены только методы класса, чтобы не было необходимости в создании экземпляров.

classmethod find_module(fullname, path=None)

Class method that attempts to find a loader for the module specified by fullname on sys.path or, if defined, on path. For each path entry that is searched, sys.path_importer_cache is checked. If a non-false object is found then it is used as the path entry finder to look for the module being searched for. If no entry is found in sys.path_importer_cache, then sys.path_hooks is searched for a finder for the path entry and, if found, is stored in sys.path_importer_cache along with being queried about the module. If no finder is ever found then None is both stored in the cache and returned.

classmethod invalidate_caches()

Вызывает importlib.abc.PathEntryFinder.invalidate_caches() для всех поисковиков, хранящихся в sys.path_importer_cache.

class importlib.machinery.FileFinder(path, *loader_details)

Конкретная реализация importlib.abc.PathEntryFinder, которая кэширует результаты из файловой системы.

Аргумент path – это каталог, за поиск в котором отвечает искатель.

Аргумент loader_details – это переменное количество кортежей из двух элементов, каждый из которых содержит загрузчик и последовательность расширений файлов, которые этот загрузчик распознает. Загрузчики должны быть вызываемыми объектами, принимающими два аргумента: имя модуля и путь к найденному файлу.

Поисковик будет кэшировать содержимое каталогов по мере необходимости, выполняя вызовы stat для каждого поиска модуля, чтобы убедиться, что кэш не устарел. Поскольку устаревание кэша зависит от точности информации о состоянии файловой системы, предоставляемой операционной системой, существует потенциальное состояние гонки: поиск модуля, создание нового файла и последующий поиск модуля, который представляет этот новый файл. Если операции выполняются достаточно быстро, чтобы уложиться в точность вызовов stat, то поиск модуля завершится неудачей. Чтобы этого избежать, при динамическом создании модуля обязательно вызывайте importlib.invalidate_caches().

Новое в версии 3.3.

path

Путь, в котором будет искать искатель.

find_loader(fullname)

Попытка найти загрузчик для обработки fullname в path.

invalidate_caches()

Очищает внутренний кеш.

classmethod path_hook(*loader_details)

Метод класса, который возвращает замыкание для использования в sys.path_hooks. Замыкание возвращает экземпляр FileFinder, используя аргумент path, переданный замыканию напрямую, и loader_details косвенно.

Если аргумент замыкания не является существующим каталогом, возникает ImportError.

class importlib.machinery.SourceFileLoader(fullname, path)

Конкретная реализация importlib.abc.SourceLoader путем наследования от importlib.abc.FileLoader и предоставления некоторых конкретных реализаций других методов.

Новое в версии 3.3.

name

Имя модуля, который будет обрабатывать этот загрузчик.

path

Путь к исходному файлу.

is_package(fullname)

Возвращает true, если path указывает на пакет.

path_stats(path)

Конкретная реализация importlib.abc.SourceLoader.path_stats().

set_data(path, data)

Конкретная реализация importlib.abc.SourceLoader.set_data().

class importlib.machinery.SourcelessFileLoader(fullname, path)

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

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

Новое в версии 3.3.

name

Имя модуля, который будет обрабатывать загрузчик.

path

Путь к файлу байт-кода.

is_package(fullname)

Определяет, является ли модуль пакетом, на основе path.

get_code(fullname)

Возвращает объект кода для name, созданный из path.

get_source(fullname)

Возвращает None, поскольку при использовании этого загрузчика файлы байт-кода не имеют исходного кода.

class importlib.machinery.ExtensionFileLoader(fullname, path)

Конкретная реализация importlib.abc.InspectLoader для модулей расширений.

Аргумент fullname задаёт имя модуля, который должен поддерживать загрузчик. Аргумент path – это путь к файлу модуля-расширения.

Новое в версии 3.3.

name

Имя модуля, который поддерживает загрузчик.

path

Путь к модулю-расширению.

load_module(fullname)

Загружает модуль расширения только в том случае, если fullname совпадает с name или является None.

is_package(fullname)

Возвращает True, если путь к файлу указывает на модуль __init__ пакета на основе EXTENSION_SUFFIXES.

get_code(fullname)

Возвращает None, поскольку у модулей расширения нет объекта кода.

get_source(fullname)

Возвращает None, поскольку модули-расширения не имеют исходного кода.

30.6.5. importlib.util – Вспомогательный код для импортёровimportlib.util – Utility code for importers

Этот модуль содержит различные объекты, помогающие в создании импортёра.

importlib.util.resolve_name(name, package)

Преобразует относительное имя модуля в абсолютное.

Если name не содержит начальных точек, то просто возвращается name. Это позволяет использовать, например, importlib.util.resolve_name('sys', __package__) без проверки того,\нуказан ли аргумент package.

ValueError возникает, если name является относительным именем модуля, но package имеет ложное значение (например, None или пустая строка). ValueError также возникает, если относительное имя выходит за пределы содержащего пакета (например, запрос ..bacon из пакета spam).

Новое в версии 3.3.

@importlib.util.module_for_loader

Декоратор декоратор для метода загрузчика, предназначенный для выбора подходящего объекта модуля для загрузки. Декорированный метод должен иметь сигнатуру вызова с двумя позиционными аргументами (например, load_module(self, module)), где второй аргумент будет объектом модуля, используемым загрузчиком. Обратите внимание, что декоратор не будет работать со статическими методами из-за предположения о двух аргументах.

Декорированный метод будет принимать имя name модуля для загрузки, как и ожидается для загрузчика. Если модуль не найден в sys.modules, то создаётся новый, у которого атрибут __name__ устанавливается в name, __loader__ в self, а __package__ устанавливается, если importlib.abc.InspectLoader.is_package() определён для self и не вызывает ImportError для name. Если новый модуль не нужен, то модуль, найденный в sys.modules, будет передан в метод.

Если декорированный метод вызывает исключение и модуль был добавлен в sys.modules, он будет удалён, чтобы предотвратить оставление частично инициализированного модуля в sys.modules. Если модуль уже находился в sys.modules, то он остаётся без изменений.

Использование этого декоратора берёт на себя все детали того, какой объект модуля должен инициализировать загрузчик, как указано в PEP 302, настолько хорошо, насколько это возможно.

Изменено в версии 3.3: __loader__ и __package__ автоматически устанавливаются (когда это возможно).

@importlib.util.set_loader
Декоратор декоратор для метода загрузчика, предназначенный для установки атрибута __loader__ на загруженных модулях. Если атрибут уже установлен, декоратор ничего не делает. Предполагается, что первый позиционный аргумент обёрнутого метода (т.е. self) – это то, на что должен быть установлен __loader__.

Примечание

Рекомендуется использовать module_for_loader() вместо этого декоратора, поскольку он включает в себя эту функциональность.

@importlib.util.set_package

Декоратор декоратор для загрузчика, устанавливающий атрибут __package__ на модуле, возвращаемом загрузчиком. Если __package__ уже установлен и имеет значение, отличное от None, он не будет изменён. Обратите внимание, что атрибут устанавливается на модуле, возвращаемом загрузчиком, а не на модуле, найденном в sys.modules.

Использовать этот декоратор не рекомендуется, если есть возможность установить __package__ до импорта. При предварительной установке код модуля выполняется с установленным атрибутом и, таким образом, может быть использован глобальным кодом во время инициализации.

Примечание

Рекомендуется использовать module_for_loader() вместо этого декоратора, поскольку он включает в себя эту функциональность.