如何编写嵌套的 __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.py
到 module.submodule2.function
和 subsubmodules2/source.py
到 module.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 本身已经可以作为它们各自的名称使用。不必——事实上不应该——将它们导入父模块。如果代码 使用 包导入它们,它们将被导入。
我正在努力处理我正在编写的 Python 包中的嵌套 __init__.py
。该包具有以下架构:
module/
├── __init__.py
├── submodule1
│ ├── __init__.py
│ └── source.py
└── submodule2
├── __init__.py
├── source.py
└── subsubmodule2
├── __init__.py
└── source.py
我的意图是能够访问 submodule2/source.py
到 module.submodule2.function
和 subsubmodules2/source.py
到 module.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 本身已经可以作为它们各自的名称使用。不必——事实上不应该——将它们导入父模块。如果代码 使用 包导入它们,它们将被导入。