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
長さを指定することはできません。
できません。リストは変更可能な可変長構造です。固定長の構造が必要な場合は、代わりにタプルを使用します。
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
リストは、固定長データ構造では、単に間違ったデータ型です。
これまでのところ、タプルのみが固定数のフィールドの指定をサポートしており、固定数の繰り返しのショートカットはありません。
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)
リストは変更可能な可変長の型であるため、型宣言を使用して固定サイズを指定しても意味がありません。