延迟加载Python模块的最佳实践

2024-06-01 10:03:28 发布

您现在位置:Python中文网/ 问答频道 /正文

有时我希望在Python中加载惰性模块。通常是因为我希望保持运行时需求或启动时间较低,并且将代码拆分为子模块会很麻烦。一个典型的用例和我当前首选的实现是:

jinja2 = None

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

我想知道:有没有一种规范的/更好的方法来实现延迟模块加载?


Tags: 模块代码selfnonejinja2defwith时间
3条回答

您没有理由手动跟踪导入——VM维护一个已经导入的模块列表,随后任何导入该模块的尝试都会导致在sys.module s中进行快速dict查找,而不会执行其他操作。

你的代码和

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

是零——当我们点击那个代码时,如果jinja2还没有被导入,那么它就会被导入。如果已经发生了,执行将继续。

其他的答案已经涵盖了实际的细节,但是如果您对延迟加载库感兴趣,请查看apipkg,它是py包(py.testfame)的一部分。

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

不需要缓存导入的模块;Python已经这样做了。

相关问题 更多 >