NamedTuple
とTypedDict
はかなり似ており、Python開発者自身がそれを認識しているようです。
PEPについては、NamedTupleとTypedDictに関する共通のセクションを追加します。これらは非常に似ており、後者はすでに構造的に動作しています。どう思いますか? ソース
しかし、それではグイドはそのことについてあまり確信が持てないようです。
NamedTupleとTypedDictが本当に似ているかどうかはよくわかりません(ただし、どちらも静的に型指定された世界で古いパターンを処理しようとしている場合を除きます)。
ですから、これは、公式ドキュメントが不足しているように見える他の人との明確な比較を思い付かせるための私の怠惰な試みです。
Pythonとそのコミュニティは、「構造体」の問題に取り組んでいます。関連する値をコンポーネントに論理的/簡単にアクセスできる複合データオブジェクトにグループ化する方法(通常は名前で)。 多くの競合するアプローチがあります:
collections.namedtuple
インスタンスTuple
やlist
のようなシーケンス。各位置/スロットの意味は暗黙的です(古風ですが、非常に一般的です)。「それを行うための明白な方法は1つ(できれば1つだけ)あるはずです。」
Pythonコミュニティ全体)のようなtyping
ライブラリとMypyの両方は、複合オブジェクトを含め、タイプ/スキーマをより効果的に定義する方法に同時に取り組んでいます。 toはそのレスリングの一部であり、前進する方法を見つけようとしています。
NamedTuple
は、collections.namedtuple
ファクトリから生成される構造化オブジェクトの型指定スーパークラスです。 TypedDict
a固定スキーマディクショナリの使用時に発生するキーとそれに対応するタイプの値を定義するMypyの試み。 「型付きの値の固定セットにマップする必要のあるキーの固定セットがある」と考えている場合も同様です。しかし、結果の実装と制約は大きく異なります。バッグと箱は似ていますか?多分。そうでないかもしれない。あなたの視点とそれらをどのように使いたいかに依存します。ワインを注ぎ、議論を始めましょう!
ところで、NamedTuple
はPythonの正式な一部になりました。
from typing import NamedTuple
class Employee(NamedTuple):
name: str
id: int
TypedDict
はではありませんPythonの一部ですが、タイピングを行うための実験的なMypy機能は辞書の異種、構造指向の使用。
from mypy_extensions import TypedDict
Movie = TypedDict('Movie', {'name': str, 'year': int})
それらの違いにもかかわらず、NamedTuple
とTypedDict
はどちらも、使用する特定のキーと、各キーに対応する値のタイプをロックダウンします。したがって、彼らは基本的に同じ目標を目指しています:複合型/構造体型の有用な型付けメカニズムであること。
Pythonの標準typing.Dict
は、キー自体ではなく、キー/値タイプの定義に、より均質な並列マッピングに焦点を当てています。したがって、たまたま辞書に保存されている複合オブジェクトを定義するのにはあまり役に立ちません。
ConnectionOptions = Dict[str, str]
NamedTuple
は特定のタイプです。名前が示すように、名前付きエントリを持つように拡張されたのはタプルです。
TypedDict
は実際のオブジェクトではありません。使用できません(または少なくとも使用しないでください)。代わりに、タイプ情報(mypyタイプチェッカーの場合)を追加して、ディクショナリにさまざまなタイプがある場合にタイプに注釈を付けるために使用されます。異なるタイプのキー。つまり、NamedTuple
を使用する必要がある場合、基本的にすべての場所。リファクタリングしたくない既存のコードに注釈を付けることは非常に役立ちます。