python 中的多层封装
Multi layer package in python
我有一个 python 包,里面有包。这个解释似乎很奇怪,所以我将包含我的包的结构:
package\_
__init__.py
subpackage1\_
__init__.py
file1.py
subpackage2\_
__init__.py
file2.py
(我简化了它以便于理解)。
顶层的 __init__.py
如下所示:
__all__ = ["subpackage1", "subpackage2"]
而且,由于某种原因,在导入包时,它无法识别来自 file1.py
或 file2.py
的任何内容。有什么解决办法吗?
如果您需要更多详细信息,请查看 github 上的项目:https://github.com/Retr0MrWave/mathModule
.我调用的目录package
在实际项目中是mathmodule_pkg
用名称填充 __all__
字段并不能使导入成为可能,它只是提示您要导入的意思。这个提示被 star-imports 用来限制导入的内容,像 pycharm 这样的 IDE 也用它来了解什么是公开的和没有公开的 - 但仅此而已。
如果您想启用嵌套 类 和函数的顶级导入,您需要
- 将它们导入顶层
__init__.py
- 将它们绑定到可用于导入的名称
- 可选地,在
__all__
中引用所述名称以使 API 漂亮且明显
以您引用的项目为例,它应该是这样的:
mathmodule_pkg/__init__.py
import mathmodule_pkg.calculus.DerrivativeAndIntegral #1
integral = mathmodule_pkg.calculus.DerrivativeAndIntegral.integral #2
__all__ = ['integral'] # 3
使用非常常见的 from some.package import some_name
形式,我们可以结合步骤 1 和 2 并减少重新绑定名称时出现错误的可能性:
from mathmodule_pkg.calculus.DerrivativeAndIntegral import integral # 1 and 2
__all__ = ['integral'] # 3
使用任何一种形式,在安装您的软件包后,可能会出现以下情况:
>>> from mathmodule_pkg import integral
>>> integral(...)
我有一个 python 包,里面有包。这个解释似乎很奇怪,所以我将包含我的包的结构:
package\_
__init__.py
subpackage1\_
__init__.py
file1.py
subpackage2\_
__init__.py
file2.py
(我简化了它以便于理解)。
顶层的 __init__.py
如下所示:
__all__ = ["subpackage1", "subpackage2"]
而且,由于某种原因,在导入包时,它无法识别来自 file1.py
或 file2.py
的任何内容。有什么解决办法吗?
如果您需要更多详细信息,请查看 github 上的项目:https://github.com/Retr0MrWave/mathModule
.我调用的目录package
在实际项目中是mathmodule_pkg
用名称填充 __all__
字段并不能使导入成为可能,它只是提示您要导入的意思。这个提示被 star-imports 用来限制导入的内容,像 pycharm 这样的 IDE 也用它来了解什么是公开的和没有公开的 - 但仅此而已。
如果您想启用嵌套 类 和函数的顶级导入,您需要
- 将它们导入顶层
__init__.py
- 将它们绑定到可用于导入的名称
- 可选地,在
__all__
中引用所述名称以使 API 漂亮且明显
以您引用的项目为例,它应该是这样的:
mathmodule_pkg/__init__.py
import mathmodule_pkg.calculus.DerrivativeAndIntegral #1
integral = mathmodule_pkg.calculus.DerrivativeAndIntegral.integral #2
__all__ = ['integral'] # 3
使用非常常见的 from some.package import some_name
形式,我们可以结合步骤 1 和 2 并减少重新绑定名称时出现错误的可能性:
from mathmodule_pkg.calculus.DerrivativeAndIntegral import integral # 1 and 2
__all__ = ['integral'] # 3
使用任何一种形式,在安装您的软件包后,可能会出现以下情况:
>>> from mathmodule_pkg import integral
>>> integral(...)