动态检查mypy中的元组长度

问题描述 投票:2回答:2

我有一个程序使用不同长度的元组类型的并集,它会动态检查元组的长度以精简类型。 Mypy在这种动态检查之后无法识别出变量的类型,因此它会报告虚假的类型错误。如何以mypy理解的方式动态检查元组长度?

在以下示例中,即使前一行的断言确保其类型为shape,当Tuple[int, int]用作两个值的元组时,mypy也会报告错误。

from typing import *

def f(dimensions: int,
      shape: Union[Tuple[int, int], Tuple[int, int, int]]):
    if dimensions == 2:
        assert len(shape) == 2
        height, width = shape
        print(height * width)

Mypy在元组拆包行上报告错误:error: Too many values to unpack (2 expected, 3 provided)

我在Python 3.7.4中使用mypy 0.720。

python tuples mypy
2个回答
2
投票

我认为如果将尺寸传递为2,但传递包含3个整数的元组,则会发生这种情况。是这样吗?

非常确定您可以使用:

dimensions = len(shape) 

在函数顶部,以获取所传递的元组中的实际条目数,而不需要传递(可能是错误的)维参数。

这似乎是一个通用的python问题,与mypy无关,但是我很可能错了,错过了一些重要的东西:)

此外,如果您想在函数中支持任何长度的元组,我相信您可以使用Tuple [int,...]类型来支持具有任意数字(如果为int的元组)的,而不是使用联合(如果这样的话)想要的。


0
投票

您可以使用显式cast

if dimensions == 2:
    assert len(shape) == 2
    shape = cast(Tuple[int, int], shape)
    height, width = shape
    print(height * width)

此外,正如其他答案所指出的,dimension参数是多余的,您可以这样做

def f2(shape: Union[Tuple[int, int], Tuple[int, int, int]]):
    dimensions: int = len(shape)
    if dimensions == 2:
        shape = cast(Tuple[int, int], shape)
        height, width = shape
        print(height * width)         
© www.soinside.com 2019 - 2024. All rights reserved.