我想知道是否有人对 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
有什么想法吗?
非常感谢。
答案 0 :(得分:7)
答案 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",
}
})