当我在以下代码上运行mypy时,我得到

需要2个以上的值才能解包(预计3个)

如何修复此问题?

def func(third: bool = False) -> tuple[int, int] | tuple[int, int, int]:
    if third:
        return 1, 2, 3
    else:
        return 1, 2
        
a, b, c = func(True) # mypy error line

在这种情况下,func实际上返回三个值.我正在使用Python 3.10.4.

推荐答案

所描述的情况是overloading的典型用例.

您可以对函数进行注释,使True参数返回3元组,False-2元组返回:

from typing import overload, Literal

@overload
def func(third: Literal[True]) -> tuple[int, int, int]: 
    ...
@overload
def func(third: Literal[False] = ...) -> tuple[int, int]:
    ...
    
def func(third: bool = False) -> tuple[int, int] | tuple[int, int, int]:
    if third:
        return 1, 2, 3
    else:
        return 1, 2
        
a, b, c = func(True)
a, b = func(False)
a, b = func()

Playground

当前代码中的问题是mypy不知道返回类型是2元组还是3元组.它不会对实现进行额外的假设,类型提示是严格的.您的代码可能如下所示(mypy以完全相同的方式解释):

import random
def func(three: bool = False) -> tuple[int, int] | tuple[int, int, int]:
    if random.random() < 0.5:
        return 1, 1
    else:
        return 1, 1, 1

a, b, c = func()

...现在,您的代码在(大约)50%的情况下会失败,并且mypy%指向该错误.

Python相关问答推荐

在有限数量的唯一字母的长字符串中,找到包含重复不超过k次的所有唯一字母的最长子字符串

在Python中是否可以输入使用任意大小参数列表的第一个元素的函数

ValueRight:参数目标和输出必须具有相同的形状.接收:目标.形状=(无,512),输出.形状=(无,3)

Pandas使用过滤器映射多列

Pandas read_jsonfuture 警告:解析字符串时,to_datetime与单位的行为已被反对

使用图片生成PDF Django rest框架

如何从FDaGrid实例中删除某些函数?

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

使用LineConnection动画1D数据

如何使用Jinja语法在HTML中重定向期间传递变量?

将整组数组拆分为最小值与最大值之和的子数组

按顺序合并2个词典列表

如何在python xsModel库中定义一个可选[December]字段,以产生受约束的SON模式

NP.round解算数据后NP.unique

ODE集成中如何终止solve_ivp的无限运行

优化器的运行顺序影响PyTorch中的预测

pandas在第1列的id,第2列的标题,第3列的值,第3列的值?

未知依赖项pin—1阻止conda安装""

旋转多边形而不改变内部空间关系

在Google Drive中获取特定文件夹内的FolderID和文件夹名称