Подтвердить что ты не робот

Лучшая практика для ленивых модулей загрузки Python

Иногда мне нужна ленивая загрузка модуля в Python. Обычно, потому что я хочу, чтобы требования времени выполнения или время запуска были низкими и разделение кода на подмодули было бы громоздким. Типичным вариантом использования и моей предпочтительной в настоящее время реализацией является следующее:

jinja2 = None

class Handler(...):
    ...
    def render_with_jinja2(self, values, template_name):
        global jinja2
        if not jinja2:
            import jinja2
        env = jinja2.Environment(...)
        ...

Интересно: существует ли канонический/лучший способ реализации ленивой загрузки модуля?

4b9b3361

Ответ 1

Нет причин для отслеживания импорта вручную - виртуальная машина поддерживает список уже импортированных модулей, и любые последующие попытки импортировать этот модуль приводят к быстрому поиску dict в sys.modules и ничего более,

Разница между вашим кодом и

def render_with_jinja2(self, values, template_name):
    import jinja2
    env = jinja2.Environment(...)

равен нулю - когда мы нажимаем этот код, если jinja2 не был импортирован, он затем импортируется. Если это уже было, выполнение продолжается.

Ответ 2

class Handler(...):
    ...
    def render_with_jinja2(self, values, template_name):
        import jinja2
        env = jinja2.Environment(...)
        ...

Нет необходимости кэшировать импортированный модуль; Python делает это уже.

Ответ 3

Другие ответы затронули фактические данные, но если вы заинтересованы в ленивой библиотеке загрузки, посмотрите apipkg, которая является частью пакета py (py.test слава).