Python输入:在运行时创建Tuple类型

问题描述

我想创建一个包含5个浮点数和一个int的元组类型。我可以通过以下方式很好地做到这一点。

from typing import Tuple

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

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

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

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

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

t: MyT = (1.0,5)

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

解决方法

没有方法可以自动创建元组类型提示或创建元组类型的过程,其中项的数量是可参数化的:您需要像在第一个示例中一样手动写出所有五种浮点类型。 / p>

相反,我建议您改为创建一个类:

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

如果愿意,可以使用dataclasses来更简洁地表示此类。

from dataclasses import dataclass

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

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

如果重要的是专门使用一个元组,我认为您唯一的选择是:

  1. 手动编写为每个要使用的元组创建新类型别名的方法。
  2. 解决诸如Tuple[Any,...]之类的问题。对于您的特定示例,执行Tuple[float,...]实际上也可以工作-iirc mypy认为int是float的子类型。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...