我有一个程序使用不同长度的元组类型的并集,它会动态检查元组的长度以精简类型。 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。
我认为如果将尺寸传递为2,但传递包含3个整数的元组,则会发生这种情况。是这样吗?
非常确定您可以使用:
dimensions = len(shape)
在函数顶部,以获取所传递的元组中的实际条目数,而不需要传递(可能是错误的)维参数。
这似乎是一个通用的python问题,与mypy无关,但是我很可能错了,错过了一些重要的东西:)
此外,如果您想在函数中支持任何长度的元组,我相信您可以使用Tuple [int,...]类型来支持具有任意数字(如果为int的元组)的,而不是使用联合(如果这样的话)想要的。
您可以使用显式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)