Python 模块懒加载最佳实践

61 投票
4 回答
37799 浏览
提问于 2025-04-16 07:03

有时候我想在Python中使用懒加载模块。通常是因为我想保持运行时的需求或启动时间较低,而把代码拆分成多个子模块会很麻烦。一个典型的使用场景和我现在喜欢的实现方式是这样的:

jinja2 = None

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

我在想:有没有更标准或更好的方式来实现懒加载模块呢?

4 个回答

12

其他回答已经讲得很详细了,不过如果你对懒加载的库感兴趣,可以看看apipkg,它是py包的一部分(大家可能听说过py.test)。

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

其实没必要自己去缓存导入的模块,因为Python已经帮你做好了这件事。

85

你不需要手动去记录哪些模块已经被导入了,因为虚拟机会自动维护一个已经导入模块的列表。之后如果再尝试导入同一个模块,系统会快速查找这个列表,根本不会再做其他事情。

你的代码和

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

之间没有区别——当我们执行那段代码时,如果jinja2还没有被导入,它就会被导入;如果已经导入过了,程序就会继续执行下去。

撰写回答