モジュールの 、 などをList
使用することの違いは何ですか?Tuple
typing
from typing import Tuple
def f(points: Tuple):
return map(do_stuff, points)
Python の型を直接参照するのではなく:
def f(points: tuple):
return map(do_stuff, points)
では、どちらを優先して使用すべきなのでしょうか?
ベストアンサー1
Python 3.9まで標準コレクションを使用した型ヒントのサポートを追加しましたコンテナの内容がどのようなタイプである必要があるかを文書化したい場合は、typing.Tuple
と を使用する必要があります。typing.List
def f(points: Tuple[float, float]):
return map(do_stuff, points)
Python 3.8まではtuple
、list
ジェネリック型として使用される上記の例では、関数の引数が 2 つの値を持つタプルであるf
必要があることを示しています。points
float
typing.Tuple
は、予想される要素の特定の数と各位置の型を指定できるという点で特別です。長さが設定されておらず、型を繰り返す必要がある場合は省略記号を使用します。sでTuple[float, ...]
可変長を表します。tuple
float
のためにtyping.List
他のシーケンス型では、一般的にすべての要素の型のみを指定します。List[str]
任意のサイズの文字列のリストです。関数は優先的にtyping.Sequence
は引数として、typing.List
通常は戻り値の型にのみ使用されます。一般的に、ほとんどの関数は任意のシーケンスを受け取り、反復するだけですが、 を返す場合list
、実際には特定の変更可能なシーケンス型を返します。
Python 3.8 以前のコードを引き続きサポートする必要がある場合は、typing
現在コンテンツを制限していない場合でも、常にジェネリックを選択する必要があります。ジェネリック型を使用すると、結果の変更が小さくなるため、後でその制約を追加する方が簡単です。
カスタムコンテナ型を実装していて、その型でジェネリックをサポートしたい場合は、__class_getitem__
フックを実装するまたは継承typing.Generic
(これにより、 が実装されます__class_getitem__
)。