web-dev-qa-db-fra.com

Spécifiez la longueur de la séquence ou de la liste avec Python

Je donne une chance au module Python typing).

Je sais qu'il est valide de spécifier la longueur d'un List comme suit *:

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

Y a-t-il un raccourci pour des listes plus longues? Et si je veux le mettre à 10 flotteurs?

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

Toute idée si cela est possible, ce serait pratique.


* REMARQUE: Il s'avère que fournir plusieurs arguments à Sequence[] (et ses sous-classes) de cette manière n'est actuellement PAS un Python valide. De plus, il n'est actuellement pas possible de spécifier une longueur Sequence en utilisant le module typing de cette manière.

18
John Brodie

Tu ne peux pas. Une liste est une structure modifiable, de longueur variable. Si vous avez besoin d'une structure de longueur fixe, utilisez plutôt un tuple:

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

Ou mieux encore, utilisez un nommé Tuple , qui a à la fois des indices et des attributs nommés:

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

Une liste est tout simplement le mauvais type de données pour une structure de données de longueur fixe.

9
Martijn Pieters

Jusqu'à présent, seuls les tuples prennent en charge la spécification d'un nombre fixe de champs et il n'a pas de raccourci pour un nombre fixe de répétitions.

Voici la définition et la docstring du module 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)

Étant donné que les listes sont un type mutable de longueur variable, cela n'a aucun sens d'utiliser une déclaration de type pour spécifier une taille fixe.

6
Raymond Hettinger