Лучшая практика для ленивых модулей загрузки Python
Иногда мне нужна ленивая загрузка модуля в Python. Обычно, потому что я хочу, чтобы требования времени выполнения или время запуска были низкими и разделение кода на подмодули было бы громоздким. Типичным вариантом использования и моей предпочтительной в настоящее время реализацией является следующее:
jinja2 = None
class Handler(...):
...
def render_with_jinja2(self, values, template_name):
global jinja2
if not jinja2:
import jinja2
env = jinja2.Environment(...)
...
Интересно: существует ли канонический/лучший способ реализации ленивой загрузки модуля?
Ответы
Ответ 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
слава).