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__.py
将 Expression
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
问题
我正在努力更新 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__.py
将 Expression
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