Python __init__.py 公开的 class 未解决的 Pylance 导入

Python Pylance unresolved import from class exposed by __init__.py

问题

我正在努力更新 Python 库以使用 Python 的现代版本(Equation 库),并且在从模块导入时遇到 Pylance 问题。图书馆的基本形式也有这个问题,但作为参考,这是我的叉子:Antyos/Equation.

如图书馆所述,您应该能够像这样导入 Expression class:

from Equation import Expression

e = Expression("sin(x+y^2)")

此代码有效,但是,Pylance 会给出以下错误:

"Expression" is unknown import symbol Pylance(reportGeneralTypeIssues)

如果我按如下方式导入代码,我不会收到错误并且可以获得类型提示。

from Equation.core import Expression

我的理解

我大致理解了这个问题——如下面的文件结构所示,from Equation.core import Expression 会起作用是有道理的。我还了解到 __init__.pyExpression class 暴露给模块的顶层。 (我仍然不完全明白这部分是如何工作的,而且我似乎找不到合适的 page/section 详细说明它。)

Equation
├─ __init__.py
├─ _info.py
├─ core.py  # Contains Expression()
├─ equation_base.py
├─ equation_scipy.py
├─ similar.py
└─ util.py

虽然我很确定我可以通过编写一个存根 (*.pyi) 文件来解决这个问题,但为 class 创建一个存根文件似乎是多余的(对我来说)我已经可以直接访问;为什么我需要重新定义已经存在的东西?但是,我也可能不完全理解存根文件/模块导入是如何工作的,这是正确的方法。

我确信这个问题以前已经解决过,但我想我一直在使用错误的术语。我错过了什么?

__init__.py 我相信你正在执行相对导入:

try:
    from Equation.core import Expression
except ImportError:
    from core import Expression

这里相对导入的正确方法是把.放在core前面,像这样.core.

例如:

try:
    from Equation.core import Expression
except ImportError:
    from .core import Expression

这修复了我尝试过的 Pylance。

规范参考:https://docs.python.org/3/reference/import.html#package-relative-imports