リスト/タプル/その他を入力から使用するか、リスト/タプル/その他として型を直接参照するか 質問する

リスト/タプル/その他を入力から使用するか、リスト/タプル/その他として型を直接参照するか 質問する

モジュールの 、 などをList使用することの違いは何ですか?Tupletyping

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まではtuplelistジェネリック型として使用される上記の例では、関数の引数が 2 つの値を持つタプルであるf必要があることを示しています。pointsfloat

typing.Tupleは、予想される要素の特定の数と各位置の型を指定できるという点で特別です。長さが設定されておらず、型を繰り返す必要がある場合は省略記号を使用します。sでTuple[float, ...]可変長を表します。tuplefloat

のためにtyping.List他のシーケンス型では、一般的にすべての要素の型のみを指定します。List[str]任意のサイズの文字列のリストです。関数は優先的にtyping.Sequenceは引数として、typing.List通常は戻り値の型にのみ使用されます。一般的に、ほとんどの関数は任意のシーケンスを受け取り、反復するだけですが、 を返す場合list、実際には特定の変更可能なシーケンス型を返します。

Python 3.8 以前のコードを引き続きサポートする必要がある場合は、typing現在コンテンツを制限していない場合でも、常にジェネリックを選択する必要があります。ジェネリック型を使用すると、結果の変更が小さくなるため、後でその制約を追加する方が簡単です。

カスタムコンテナ型を実装していて、その型でジェネリックをサポートしたい場合は、__class_getitem__フックを実装するまたは継承typing.Generic(これにより、 が実装されます__class_getitem__)。

おすすめ記事