我正在尝试导入
ArrayLike
doing
from numpy.typing import ArrayLike
,并且收到标题中提到的错误:
ModuleNotFoundError: No module named 'numpy.typing'
我知道我可以简单地编写
import numpy.typing as npt
如文档所示,但我想要简单性只是导入我想要使用的类型。这也不是我第一次遇到这种情况:我想导入特定的方法/类,但我被迫使用昵称导入父模块,否则我会收到错误。为什么?
遇到的错误“ModuleNotFoundError: No module named 'numpy.typing'”表示使用的 NumPy 版本低于 1.20。
numpy.typing
模块是在 NumPy 1.20 版本中引入的。
以下是一些解决此问题的方法:
1. 升级 NumPy:
这是最直接的解决方案。可以使用 pip 升级 NumPy:
bash
pip install --upgrade numpy
如果使用的是 Anaconda 或 Miniconda,则可以使用 conda 升级 NumPy:
bash
conda update -c conda-forge numpy
2. 如果无法升级 NumPy:
如果因为某些原因无法升级 NumPy,可以使用
typing
模块中的
Union
和 NumPy 类型来定义
ArrayLike
:
```python from typing import Union
import numpy as np
ArrayLike = Union[np.ndarray, list, tuple] ```
这将定义
ArrayLike
为
np.ndarray
、
list
或
tuple
类型的并集。
3. 使用
__future__.annotations
:
从 Python 3.7 开始,可以使用
__future__.annotations
来推迟类型注释的评估。这意味着无需在运行时导入
numpy.typing
:
```python from future import annotations
def my_function(x: "numpy.typing.ArrayLike"): # ... your code here ...
# 现在可以直接使用
numpy.typing.ArrayLike
,而无需导入它
```
请注意,这只在 Python 3.7 及更高版本中有效。
至于提到的为什么不能直接导入特定方法/类,这是因为 Python 的模块系统旨在避免循环依赖和命名空间冲突。通过强制导入父模块,Python 确保了模块之间的清晰依赖关系,并避免了命名空间中可能出现的冲突。
如果发现自己经常使用某个模块中的特定方法/类,可以考虑使用
from ... import ... as ...
语法为其创建一个更短的别名,以提高代码的可读性。