1. ホーム
  2. python

[解決済み] タイピングからリスト/タプル/等を使用する場合と、リスト/タプル/等として直接型を参照する場合について

2022-03-16 19:37:02

質問

を使用することの違いは何ですか? 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)

また、どのような場合にどちらを使うべきでしょうか?

どのように解決するのですか?

Python 3.9まで 標準的なコレクションを使用したタイプヒンティングのサポートが追加されました。 を使用する必要がありました。 typing.Tupletyping.List がどのような型であるかを文書化したい場合 コンテンツ のコンテナである必要がある。

def f(points: Tuple[float, float]):
    return map(do_stuff, points)

Python 3.8まで。 tuplelist であることをサポートしていませんでした。 として使用されます。 汎用タイプ . 上記の例では、関数 f を必要とします。 points の2つのタプルである必要があります。 float の値を指定します。

typing.Tuple は、予想される要素数と各位置のタイプを指定できるという点で、ここでは特別なものです。長さを設定せず、型を繰り返し指定する場合は省略記号を使用します。 Tuple[float, ...] は、可変長の tuplefloat s.

について typing.List などのシーケンス型は、一般にすべての要素に対して型を指定するだけです。 List[str] は文字列のリストで、大きさは問わない。なお,関数は優先的に typing.Sequence を引数とし typing.List は通常、戻り値の型にのみ使用されます。一般的にほとんどの関数は任意のシーケンスを受け取り、反復処理のみを行いますが list ということは、特定の、変更可能なシーケンスタイプを返していることになります。

Python 3.8 以前のコードをまだサポートする必要がある場合は、常に typing ジェネリックスを使用します。ジェネリック型で後から制約を追加する方が、結果的に変更が少なくて済むからです。

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