我的代码如下:
from typing import Tuple
a: Tuple[int, int] = tuple(sorted([1, 3]))
Mypy 告诉我:
赋值中的不兼容类型(表达式的类型为“Tuple[int, ...]”,变量类型为“Tuple[int, int]”)
我做错了什么?为什么 Mypy 无法弄清楚排序后的元组将返回两个整数?
Mypy 并不知道
sorted()
函数的返回值类型,因为它在运行时根据输入推断类型。 虽然你知道输入是两个整数,因此输出也是,但 Mypy 无法保证这一点。
有几种方法可以解决这个问题:
1. 类型断言:
你可以使用类型断言告诉 Mypy 返回值的确切类型。
```python from typing import Tuple
a: Tuple[int, int] = tuple(sorted([1, 3])) # type: ignore[assignment] ```
或者更明确地:
```python from typing import Tuple, cast
a: Tuple[int, int] = cast(Tuple[int, int], tuple(sorted([1, 3]))) ```
这告诉 Mypy 忽略该行的类型检查,或者明确地将结果转换为
Tuple[int, int]
。
2. 使用
typing.cast
:
```python from typing import Tuple, cast
a: Tuple[int, int] = cast(Tuple[int, int], tuple(sorted([1, 3]))) ```
这与第一种方法类似,但使用
cast()
函数可以更清楚地表明你正在执行类型转换。
3. 使用更具体的类型提示:
如果你使用的是 Python 3.9 或更高版本,可以使用
list[int]
来代替
Tuple[int, int]
,因为
sorted()
函数返回一个列表:
```python from typing import List
a: List[int] = sorted([1, 3]) ```
如果你需要一个元组,可以在排序后将其转换为元组:
```python from typing import List
a: Tuple[int, int] = tuple(sorted([1, 3])) # type: ignore[assignment] ```
这些方法都可以解决 Mypy 的错误,并明确说明你期望
sorted()
函数返回两个整数的元组。 选择哪种方法取决于你的代码风格和 Python 版本。