繁体   English   中英

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

[英]Best practice for lazy loading Python modules

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

jinja2 = None

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

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

您没有理由手动跟踪导入——VM 维护一个已导入模块的列表,任何后续导入该模块的尝试都会导致在 sys.modules 中进行快速 dict 查找。

你的代码和

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

为零——当我们点击那个代码时,如果jinja2还没有被导入,那么它就会被导入。 如果已经存在,则继续执行。

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

无需缓存导入的模块; Python 已经做到了。

其他答案已经覆盖了实际的细节,但如果你兴趣在一个延迟加载库,检查出apipkg这是一部分py包( py.test成名)。

来自 sqlalchemy 的不错模式:依赖注入:

@util.dependencies("sqlalchemy.orm.query")
def merge_result(query, *args):
    #...
    query.Query(...)

它不会在模块顶部声明所有“导入”语句,而是仅在函数实际需要时才导入模块。 这可以解决循环依赖问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM