正确地重新公开子模块(或者这是 pylance 中的错误)

问题描述 投票:0回答:1

我正在开发一个带有多个子包的 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”无法解决

这引出了我的两个问题:

  1. 我重新暴露子模块的方法是否正确,或者是否有更干净的方法?
  2. 如果问题 1 的答案已解决,但我仍然收到来自
    PyLance
    的警告,那么
    PyLance
    是否存在错误?
python packaging pylance
1个回答
0
投票

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() 等,并且 使用方便的短名称让应用程序作者看到它们。

© www.soinside.com 2019 - 2024. All rights reserved.