我正在开发一个带有多个子包的 python 包
chemcoord
,其中一些子包应该暴露在根命名空间中。
存储库位于这里, 相关的
__init__.py
文件位于 here。
例如,有一个
chemcoord.cartesian_coordinates.xyz_functions
应该可以作为 chemcoord.xyz_functions
访问
可访问尤其意味着用户应该能够编写:
from chemcoord.xyz_functions import allclose
如果我写在我的
__init__.py
import chemcoord.cartesian_coordinates.xyz_functions as xyz_functions
然后我可以在代码中使用
chemcoord.xyz_functions
,但我不能这样做
from chemcoord.xyz_functions import allclose
如果我在
sys.modules
中执行额外的丑陋/黑客(?)修改__init__.py
的技巧,如所示
import sys
sys.modules["chemcoord.xyz_functions"] = xyz_functions
那我就可以写了
from chemcoord.xyz_functions import allclose
但感觉又丑又老气。
最近我收到来自
PyLance
关于的警告
导入“chemcoord.xyz_functions”无法解决
这引出了我的两个问题:
PyLance
的警告,那么 PyLance
是否存在错误?nit:不需要
# -*- coding: utf-8 -*-
在 python 源文件中保存了很长一段时间。
解释器 3.8 去了
停产
去年,
所以你只需要担心 3.9 及更高版本。
我完全同意你的观点
sys.modules["chemcoord.xyz_functions"]
分配不合适。
我同意使用公共 API 的应用程序
应该能够使用短
from chemcoord.xyz_functions import allclose, dot
。
整理一切 来源/ 非常好,我为此表示感谢。 整个
cartesian_coordinates/
文件夹
对于包开发人员来说保持一切整洁并且很有意义。
但是,您可能希望“隐藏”代码模块
将其重命名为 _xyz_functions.py
,并以 _
下划线开头。
(我不知道你对应用开发者做出了什么承诺
在 v2.1.2 及之前版本中,这可能需要您仍然公开
部分或全部。)
针对OP问题,您抱怨应用程序作者 目前做不到
from chemcoord.xyz_functions import allclose
老实说,这很简单。
你只是有点沉迷于此
src/chemcoord/cartesian_coordinates/xyz_functions.py
文件名。
你认为这是“正确”的位置,
但这只是一个私有的实现细节,
与您选择公开的公共 API 分开,
这就是我们可能想要隐藏它的原因。
我声称你想要做什么,回答原来的问题,
不是编辑 __init__.py
模块,
你想创建一个新的src/chemcoord/xyz_functions.py
模块。
它可以拉入 allclose()、dot() 等,并且
使用方便的短名称让应用程序作者看到它们。