[英]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.