Mejores prácticas para la carga lenta de módulos Python


De vez en cuando quiero cargar módulos perezosos en Python. Por lo general, porque quiero mantener los requisitos de tiempo de ejecución o los tiempos de inicio bajos y dividir el código en submódulos sería engorroso. Un caso de uso típico y mi implementación actualmente preferida es este:

jinja2 = None

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

Me pregunto: ¿hay una manera canónica / mejor de implementar la carga de módulos perezosos?

Author: max, 2010-11-14

3 answers

No hay razón para que realice un seguimiento de las importaciones manualmente the la máquina virtual mantiene una lista de módulos que ya se han importado, y cualquier intento posterior de importar ese módulo resulta en una búsqueda rápida de dict en sys.módulos y nada más.

La diferencia entre su código y

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

Es cero when cuando pulsamos ese código, si jinja2 no se ha importado, se importa entonces. Si ya lo ha sido, la ejecución continúa.

 49
Author: bgporter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-14 13:55:13
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.

 17
Author: Glenn Maynard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-14 13:54:58

Las otras respuestas han cubierto los detalles reales, pero si está interesado en una biblioteca de carga lenta, consulte apipkg que es parte del paquete py (py.test fame).

 9
Author: Noufal Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-14 14:02:34