我如何使用importlib.LazyLoader?

ger*_*rit 8 python python-module python-import python-importlib

在我的模块中,我有几个依赖于具有较长启动时间的外部模块的功能.我该怎么用LazyLoader?如果我有

import veggies
Run Code Online (Sandbox Code Playgroud)

要么

import veggies.brussels.sprouts
Run Code Online (Sandbox Code Playgroud)

要么

from veggies.brussels import sprouts
Run Code Online (Sandbox Code Playgroud)

如何替换这些语句以便LazyLoader模块内容的执行被推迟到需要时?

从文档中可以立即明白如何使用它.没有示例,并且nullege代码搜索仅提供Python本身包含的单元测试.

Pet*_*ter 13

原来的问题有一些代码,似乎以全进口懒洋洋地:

以下文件延迟导入两个模块:

import sys
import importlib.util

def lazy(fullname):
  try:
    return sys.modules[fullname]
  except KeyError:
    spec = importlib.util.find_spec(fullname)
    module = importlib.util.module_from_spec(spec)
    loader = importlib.util.LazyLoader(spec.loader)
    # Make module with proper locking and get it inserted into sys.modules.
    loader.exec_module(module)
    return module

os = lazy("os")
myown = lazy("myown")

print(os.name)
myown.test()
Run Code Online (Sandbox Code Playgroud)

为了测试,我在myown.py.

print("Executed myown.")
def test():
  print("OK")
Run Code Online (Sandbox Code Playgroud)

效果很好(Python 3.8a0)。

  • 当前的 Python 文档有一个片段 - 非常相似!- 为此,这可以被认为比这个答案更规范:https://docs.python.org/3/library/importlib.html#implementing-lazy-imports (3认同)