Python 模块懒加载最佳实践
有时候我想在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
还没有被导入,它就会被导入;如果已经导入过了,程序就会继续执行下去。