proposal - Práctica recomendada para la carga lenta de módulos de Python
python package naming conventions (3)
Las otras respuestas han cubierto los detalles reales, pero si está interesado en una biblioteca de carga apipkg , consulte apipkg que es parte del paquete py
( py.test
fame).
De vez en cuando quiero cargar módulos en pereza en Python. Por lo general, porque quiero mantener bajos los requisitos de tiempo de ejecución o tiempos de inicio y dividir el código en submódulos sería engorroso. Un caso de uso típico y mi implementación actualmente preferida es esta:
jinja2 = None
class Handler(...):
...
def render_with_jinja2(self, values, template_name):
global jinja2
if not jinja2:
import jinja2
env = jinja2.Environment(...)
...
Me pregunto: ¿existe alguna forma canónica / mejor para implementar la carga de módulos perezosos?
No hay motivo para que realice un seguimiento de las importaciones de forma manual: la VM mantiene una lista de módulos que ya se han importado, y cualquier intento posterior de importar ese módulo da como resultado una búsqueda rápida de dict en sys.modules y nada más.
La diferencia entre tu código y
def render_with_jinja2(self, values, template_name):
import jinja2
env = jinja2.Environment(...)
es cero - cuando jinja2
ese código, si jinja2
no se ha importado, entonces se importa. Si ya lo ha sido, la ejecución continúa.
class Handler(...):
...
def render_with_jinja2(self, values, template_name):
import jinja2
env = jinja2.Environment(...)
...
No es necesario almacenar en caché el módulo importado; Python ya lo hace.