python - python中的多层包
问题描述
我有一个 python 包,里面有包。这个解释看起来很奇怪,所以我将包含我的包的结构:
package\_
__init__.py
subpackage1\_
__init__.py
file1.py
subpackage2\_
__init__.py
file2.py
(我正在简化它以便于理解)。
__init__.py
顶层看起来像这样:
__all__ = ["subpackage1", "subpackage2"]
而且,由于某种原因,在导入包时,它无法识别来自file1.py
or的任何内容file2.py
。任何想法如何解决它?
如果您需要更多详细信息,请查看 github 上的项目:https ://github.com/Retr0MrWave/mathModule
。我调用的目录package
在mathmodule_pkg
实际项目中
解决方案
用名称填充该__all__
字段不会使导入成为可能,它只是作为您要导入的意思的提示。这个提示被 star-imports 接收来限制导入的内容,像 pycharm 这样的 IDE 也使用它来了解什么是公开的和不公开的 - 仅此而已。
如果要启用嵌套类和函数的顶级导入,则需要
- 将它们导入顶层
__init__.py
- 将它们绑定到可用于导入的名称
- 可选地,引用所述名称
__all__
以使 API 美观且明显
以您引用的项目为例,它看起来像这样:
数学模块_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(...)
推荐阅读
- scala - 使用 Scala apache spark 解决顺序问题
- c# - 如何使用 C# 从 SQL 查询结果中提取部分字符串
- ruby-on-rails - 如何在控制器中访问 Rails 中的 URL 显示操作
- azure-cosmosdb - Cosmos DB - 较慢的性能问题
- ansible - ansible:在同一主机上多次运行任务,使用来自另一个主机的变量
- google-cloud-platform - 如何使用 Mac EU 键盘在 Cloud Shell 上键入特殊符号?
- cmake - 是否可以为使用 CMake 构建 yaml-cpp 设置“-fexceptions”标志
- excel - 查找两个 dd/mm/yyyy hh:mm 之间的时差
- python - 为列表中的每个元素调用 API
- r - 将df列表中的df随机划分为相等的子集