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

How to write nested __init__.py files

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

module/
├── __init__.py
├── submodule1
│   ├── __init__.py
│   └── source.py
└── submodule2
    ├── __init__.py
    ├── source.py
    └── subsubmodule2
        ├── __init__.py
        └── source.py

我的意图是能够访问 submodule2/source.pymodule.submodule2.functionsubsubmodules2/source.pymodule.submodule2.subsubmodule2.function 中定义的函数。

我尝试的第一件事是用这种方式在 submodule2 中定义 __init__.py

from .subsubmodule2 import *

但是这样做,我通过 module.submodule2.function(和 module.function)获得了 subsubmodules2/source.py 中定义的函数。

如果我这样做:

from . import subsubmodule2

我通过module.subsubmodule2.function获得了这些功能。

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

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

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

from . import submodule1
from . import submodule2
__all__ = ['submodule1', 'submodule2']

现在,在子模块 1 __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__ = ['souce', 'subsubmodule`]

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

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

__init__.py 文件代表其各自的包。例如module/submodule2/__init__.py表示module. submodule2 .

为了将子模块中定义的对象拉入它们的包命名空间,导入它们:

# module/submodule2/__init__.py
from .source import *

由于 __init__.py 是一个常规的 Python 模块,也可以放弃单独的 .source 模块并直接在 __init__.py:

中定义对象
# module/submodule2/__init__.py

def function():
    ...

请注意,subpackages 本身已经可以作为它们各自的名称使用。不必——事实上不应该——将它们导入父模块。如果代码 使用 包导入它们,它们将被导入。