Python 键入:在运行时创建元组类型

Python typing: Creating Tuple type at runtime

我想创建一个类型,它是一个包含 5 个浮点数和一个 int 的元组。我可以通过以下方式完成此操作,效果很好。

from typing import Tuple

MyT = Tuple[float, float, float, float, float, int]
t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

但是如果我想要更多的浮点数,一遍又一遍地输入相同的内容会很烦人。有没有办法以参数化的方式创建这样的类型?我知道将元组传递给 Tuple[] 也可以,即

MyT = Tuple[(float, float, float, float, float, int)]
t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

因此,我尝试了以下方法。

tup = ((float, ) * 5) + (int, )
MyT = Tuple[tup]

t: MyT = (1.0, 1.0, 1.0, 1.0, 1.0, 5)

但这无法通过 mypy 进行类型检查。我想这是因为传递给 Tuple[] 的元组仅在运行时创建?有没有类似的方法可以工作? 使用 Python 3.8.6 和 MyPy 0.782 进行测试。

无法自动执行创建元组类型提示的过程或创建项目数可参数化的元组类型:您需要像在第一个示例中那样手动写出所有五种浮点类型.

相反,我建议您创建一个 class:

class MyT:
    def __init__(self, a: List[float], b: int) -> None:
        self.a = a
        self.b = b

如果您愿意,可以使用 dataclasses 更简洁地表达此 class:

from dataclasses import dataclass

@dataclass
class MyTVersion2:
    a: List[float]
    b: int

使用 class 或数据 class 应该可以让您直接支持存储可变数量的浮点数,同时还可以让其他人更容易理解您的数据结构。

如果特别使用元组很重要,我认为您唯一的选择是:

  1. 解决手动编写为您要使用的每种元组创建新类型别名的问题。
  2. 满足于 Tuple[Any, ...] 之类的东西。执行 Tuple[float, ...] 实际上也可能适用于您的特定示例——iirc mypy 认为整数是浮点数的子类型。