指定序列或列表的长度与Python打字模块

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

我给了Python模块typing一个镜头。

我知道它是有效的指定类似下面的List的长度*:

List[float, float, float]   # List of 3 floats <-- NOTE: this is not valid Python

是否有较长的列表任何速记?如果我想怎么把它设置为10辆花车?

List[float * 10]   # This doesn't work.

任何想法,如果这是可能的,这将是得心应手。


*注:事实证明,以这种方式提供多个参数来Sequence[](及其子类),目前还没有有效的Python。此外,它是目前无法使用Sequence模块以这种方式来指定typing长度。

python python-3.x type-hinting mypy
2个回答
4
投票

你不能。列表是可变的,可变长结构。如果你需要一个固定长度的结构,使用一个元组,而不是:

Tuple[float, float, float, float, float, float, float, float, float, float]

或者更好的是,使用named tuple,其中有两个指数和命名的属性:

class BunchOfFloats(NamedTuple):
    foo: float
    bar: float
    baz: float
    spam: float
    ham: float
    eggs: float
    monty: float
    python: float
    idle: float
    cleese: float

列表是简单地为一个固定长度的数据结构中的错误的数据类型。


3
投票

到目前为止,只有元组支持字段指定一个固定数量,它有没有捷径的固定数量的重复。

下面是来自typing模块定义和文档字符串:

class Tuple(tuple, extra=tuple, metaclass=TupleMeta):
    """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.

    Example: Tuple[T1, T2] is a tuple of two elements corresponding
    to type variables T1 and T2.  Tuple[int, float, str] is a tuple
    of an int, a float and a string.

    To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
    """

    __slots__ = ()

    def __new__(cls, *args, **kwds):
        if _geqv(cls, Tuple):
            raise TypeError("Type Tuple cannot be instantiated; "
                            "use tuple() instead")
        return _generic_new(tuple, cls, *args, **kwds)

由于名单是可变的,可变长度的类型,它没有任何意义,使用类型声明指定一个固定的大小。

© www.soinside.com 2019 - 2024. All rights reserved.