如何编写嵌套的 __init__.py 文件

MBR*_*MBR 6 python python-module python-3.x

我正在努力解决嵌套__init__.py在我正在编写的Python包中的问题。该包具有以下架构:

\n
module/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 submodule1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source.py\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 submodule2\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n    \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 source.py\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 subsubmodule2\n        \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 source.py\n
Run Code Online (Sandbox Code Playgroud)\n

我的目的是能够访问submodule2/source.pythroughmodule.submodule2.function和 in subsubmodules2/source.pythrough中定义的函数module.submodule2.subsubmodule2.function

\n

我尝试的第一件事就是__init__.py这样定义submodule2

\n
from .subsubmodule2 import *\n
Run Code Online (Sandbox Code Playgroud)\n

subsubmodules2/source.py但这样做,我得到了through module.submodule2.function(and )中定义的函数module.function

\n

如果我做:

\n
from . import subsubmodule2\n
Run Code Online (Sandbox Code Playgroud)\n

我通过module.subsubmodule2.function.

\n

我还尝试__all__在 中定义关键字__init__,但没有成功。如果我很好地理解Python 文档,我想我可以保留空__init__.py文件并且它可以工作,但根据我的理解,这也不是最佳实践。

\n

按照我的模块的预期访问这些功能的最佳方式是什么?

\n

tem*_*mmo 2

module __init__.py文件中写入您要导入的模块

from . import submodule1
from . import submodule2
__all__ = ['submodule1', 'submodule2']
Run Code Online (Sandbox Code Playgroud)

现在,在 submodule1__init__.py文件中写入

from . import source
from . import subsubmodule
# if you want to import functions from source then import them or in source.py
# define __all__ and add function which you want to expose
__all__ = ['source', 'subsubmodule']
Run Code Online (Sandbox Code Playgroud)

现在在子子模块__init__文件中定义要公开的函数或类

from . source import *
__all__ =  ['source']
# if you want to use * as import, i suggest you to use __all__ in source.py and mention all exposed function there
Run Code Online (Sandbox Code Playgroud)