web-dev-qa-db-ja.com

Python入力モジュールでシーケンスまたはリストの長さを指定します

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長さを指定することはできません。

18
John Brodie

できません。リストは変更可能な可変長構造です。固定長の構造が必要な場合は、代わりにタプルを使用します。

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

あるいは、インデックスと名前付き属性の両方を持つ 名前付きタプル を使用します。

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

リストは、固定長データ構造では、単に間違ったデータ型です。

9
Martijn Pieters

これまでのところ、タプルのみが固定数のフィールドの指定をサポートしており、固定数の繰り返しのショートカットはありません。

typing モジュールの定義とdocstringは次のとおりです。

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)

リストは変更可能な可変長の型であるため、型宣言を使用して固定サイズを指定しても意味がありません。

6