web-dev-qa-db-ja.com

Python / mypyのNamedTupleとTypedDictの主な違いは何ですか?

NamedTupleTypedDictはかなり似ており、Python開発者自身がそれを認識しているようです。

PEPについては、NamedTupleとTypedDictに関する共通のセクションを追加します。これらは非常に似ており、後者はすでに構造的に動作しています。どう思いますか? ソース

しかし、それではグイドはそのことについてあまり確信が持てないようです。

NamedTupleとTypedDictが本当に似ているかどうかはよくわかりません(ただし、どちらも静的に型指定された世界で古いパターンを処理しようとしている場合を除きます)。

ソース

ですから、これは、公式ドキュメントが不足しているように見える他の人との明確な比較を思い付かせるための私の怠惰な試みです。

11
Christoph

Pythonとそのコミュニティは、「構造体」の問題に取り組んでいます。関連する値をコンポーネントに論理的/簡単にアクセスできる複合データオブジェクトにグループ化する方法(通常は名前で)。 多くの競合するアプローチがあります:

  • collections.namedtupleインスタンス
  • 辞書(固定/既知のキーのセット)
  • 属性にアクセス可能な辞書(- stuf など)
  • attrs ライブラリ
  • PEP 557 dataclasses
  • すべての構造体タイプ用に手作りされたプレーンな古い特注オブジェクト
  • Tuplelistのようなシーケンス。各位置/スロットの意味は暗黙的です(古風ですが、非常に一般的です)。
  • 等.

「それを行うための明白な方法は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})

それらの違いにもかかわらず、NamedTupleTypedDictはどちらも、使用する特定のキーと、各キーに対応する値のタイプをロックダウンします。したがって、彼らは基本的に同じ目標を目指しています:複合型/構造体型の有用な型付けメカニズムであること。

Pythonの標準typing.Dictは、キー自体ではなく、キー/値タイプの定義に、より均質な並列マッピングに焦点を当てています。したがって、たまたま辞書に保存されている複合オブジェクトを定義するのにはあまり役に立ちません。

ConnectionOptions = Dict[str, str] 
1
Jonathan Eunice

NamedTupleは特定のタイプです。名前が示すように、名前付きエントリを持つように拡張されたのはタプルです。

TypedDictは実際のオブジェクトではありません。使用できません(または少なくとも使用しないでください)。代わりに、タイプ情報(mypyタイプチェッカーの場合)を追加して、ディクショナリにさまざまなタイプがある場合にタイプに注釈を付けるために使用されます。異なるタイプのキー。つまり、NamedTupleを使用する必要がある場合、基本的にすべての場所。リファクタリングしたくない既存のコードに注釈を付けることは非常に役立ちます。

0
Derek