【发布时间】:2020-04-13 03:06:22
【问题描述】:
我的程序使用不同长度的元组类型的联合,它动态检查元组的长度以优化类型。 Mypy 无法识别出在这种动态检查之后更准确地知道变量的类型,因此它会报告虚假类型错误。如何以 mypy 理解的方式动态检查元组长度?
在以下示例中,当 shape 用作两个值的元组时,mypy 会报告错误,即使上一行的断言确保其类型为 Tuple[int, int]。
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)。
我将 mypy 0.720 与 Python 3.7.4 一起使用。
【问题讨论】:
-
为什么将
dimensions作为单独的参数传递,而不是直接使用len(shape)? -
我认为这个建议会提供更好的python代码,但我认为它不会解决
mypy问题。 -
无直接支持:python/mypy#1178,建议使用
cast作为解决方法。 -
@Code-Apprentice 该示例是从一个较大的程序中简化而来的,其中
dimensions和shape存在于不同的数据结构中,因为其他代码需要它们。