延迟加载模块在__init__.py文件python中导入

时间:2013-07-09 10:48:47

标签: python lazy-loading import

我想知道是否有人对 init 文件中的延迟加载导入有任何建议?我目前有以下文件夹结构:

/mypackage
    __init__.py
    /core
        __init__.py
        mymodule.py
        mymodule2.py

核心文件夹中的 init .py文件,包含以下导入:

from mymodule import MyModule
from mymodule2 import MyModule2

这样我就可以这样做:

from mypackage.core import MyModule, MyModule2

但是,在 init .py文件包中,我有另一个导入:

from core.exc import MyModuleException

这就是每当我在python中导入我的包时,MyModule和MyModule2默认导入,因为核心 init .py文件已经运行。

我想要做的是,只有在运行以下代码时才导入这些模块,而不是之前:

from mypackage.core import MyModule, MyModule2

有什么想法吗?

非常感谢。

4 个答案:

答案 0 :(得分:7)

除非我误解了你的意图,否则这实际上是可能的,但需要一些魔力。

基本上,子类types.ModuleType并覆盖__getattr__以按需导入。

查看Werkzeug init.py以获取示例。

答案 1 :(得分:1)

你做不到。请记住,当python导入时,它会执行模块中的代码。模块本身不知道它是如何导入的,因此无法知道是否必须导入MyModule(2)

您必须选择:允许from mypackage.core import A, B from core.exc import E不需要的导入(x)不导入{{1 {}}中的{}和A,因此不允许B

注意:我个人不会在core/__init__.py中导入from mypackage.core import A, B,但我会添加MyModule(2)模块执行此操作,因此用户可以执行core/__init__.py 仍然all.py没有加载不必要的类。

(实际上:from mypackage.core.all import A, B模块甚至可以修改from mypackage.core.exc import TheException并将类添加到其中,以便跟随导入all种类的工作,但是我认为这将是非常模糊的,应该避免。)

答案 2 :(得分:0)

如果您的模块结构如下:

/mypackage
  __init__.py
  /core
    __init__.py
    MyModule.py
    MyModule2.py

或:

/mypackage
  __init__.py
  /core
    __init__.py
    /MyModule
      __init__.py
    /MyModule2
      __init__.py

然后随意使用

from mypackage.core import MyModule, MyModule2

未在__init__.py

下的mypackage/core中导入它们

答案 3 :(得分:0)

您可以在模块中的__init__中使用以下代码:

import apipkg
apipkg.initpkg(__name__, {
    'org': {
        'Class1': "secure._mypkg:Class1",
        'Class2': "secure._mypkg2:Class2",
    }
})