首页 > 编程问答 >如何让 Mypy 认识到对两个整数进行排序会返回两个整数

如何让 Mypy 认识到对两个整数进行排序会返回两个整数

时间:2024-07-24 11:55:47浏览次数:6  
标签:python python-typing mypy

我的代码如下:

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 版本。

标签:python,python-typing,mypy
From: 56471335

相关文章

  • 如何使用 C# 检查用户是否安装了最低 Python 版本并且可以访问我的代码?
    我正在开发一个C#程序,该程序必须为一项特定任务运行一些Python代码。(Python代码很复杂,是由另一个团队开发的。无法在C#中重现其功能。)我正在尝试更新我的程序的安装程序文件以解决此问题:我希望它检查用户是否(谁正在安装我的程序)已安装Python并且它满足我的最低版......
  • 如何优雅地将复杂的Python对象和SQLAlchemy对象模型类结合起来?
    我有一个相当复杂的类,具有从提供的df到init计算的复杂属性,这些属性可能是最终可以序列化为字符串的其他类类型。在Python中,我想处理对象而不是原始类型,但也想使用SQLAlchemy与数据库交互。表中的列与许多类属性相同,如何优雅地组合这两个类?我可以使用组合并将数据......
  • Python Match Case:检查未知长度的可迭代内部的类型
    我想使用匹配大小写检查一个未知长度的迭代(假设为list)仅包含给定类型(假设为float)(还有其他情况,只有这个给我带来了问题)。case[*elems]ifall([isinstance(elem,float)foreleminelems]):returnnum这个似乎可行,但确实很不Pythony。看来应该有更简单的方法。......
  • Python实现excel数据的读取和写入
    1.安装说到前面的话,实现excel文件数据的读取和写入,在python中还有其它方法,比如说pandas。鉴于最近粉丝朋友问到上面的“xlrd”和“xlwt”,那么笔者下面将通过这两个方法,来实现excel文件数据的读取和写入。首先,我们先需要提前安装好对应的库。需要注意的是,xlrd从2.0版本开始,只......
  • python_进程与线程_多线程
    一、程序与进程的概念1、进程:指启动后的程序,系统会为进程分配内存空间二、创建进程的方式1、第一种创建进程的方式process(group=None,target,name,args,kwargs)group:表示分组,实际上不使用,默认为None即可target:表示子进程要执行的任务,支持函数名name:表示子进程的......
  • python_网络编程_socket
    一、网络编程的基本概念通信协议:internet协议,任何私有网络支持此协议,就可以接入互联网二、七层协议与四层协议从下到上分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层三、掌握TCP、IP协议ip协议是整个TCP、IP协议族的核心IP地址就是会联网上计算......
  • 你能对 Python 类型注释进行模式匹配吗?
    你能在Python类型上进行模式匹配吗?我见过简单的例子:importbuiltinsmatchx:casebuiltins.str:print("matchedstr")casebuildins.int:print("matchedint")但我想在嵌套类型上进行模式匹配,比如Annotated[Optional[Literal["a",......
  • python Polars:替换嵌套列表的元素
    有谁知道是否可以有效地替换极坐标中嵌套列表的元素。例如:s=pl.Series('s',[[1,2,3],[3,4,5]])#replace3with10toget[[1,2,10],[10,4,5]]我已经尝试过s.to_frame().with_columns(pl.when(pl.col('s')==3)...)但是pl.when不喜欢List[bo......
  • Python 中的常量应该大写吗?
    在PEP8中,一般规则是在UPPER_CASE字符中声明常量。在现实生活中,可能有多种情况:#!envpythonDATABASE_HOST='localhost'app=Flask('myapp')base_two=partial(int,base=2)通常我们将字符串类型或数字类型变量视为不可变的,因此是常量,而不是对象或函数。问题是......
  • 多重处理会导致 Python 崩溃,并给出一个错误:调用 fork() 时可能已在另一个线程中进行
    我对Python比较陌生,并试图为我的for循环实现一个多处理模块。我在img_urls中存储了一个图像url数组,我需要下载并应用一些Google视觉。if__name__=='__main__':img_urls=[ALL_MY_Image_URLS]runAll(img_urls)print("---%sseconds---"%(......