namedtupleとNamedTupleの違いは何ですか?
質問
その
typing
モジュールドキュメント
は、以下の2つのコードスニペットが同等であると言っています。
from typing import NamedTuple
class Employee(NamedTuple):
name: str
id: int
と
from collections import namedtuple
Employee = namedtuple('Employee', ['name', 'id'])
これらは全く同じものなのでしょうか、そうでないとしたら、2つの実装の違いは何なのでしょうか?
どのように解決するのですか?
サブクラス化によって生成された型
typing.NamedTuple
とは、同じように
collections.namedtuple
と同じですが
__annotations__
,
_field_types
と
_field_defaults
属性が追加されました。生成されたコードは、Pythonの何も現在これらの型付けに関連する属性に作用しないので、すべての実用的な目的のために、同じ動作をします(あなたのIDEはそれらを使用するかもしれませんが)。
開発者としては
typing
モジュールを使うことで、より自然な宣言的インターフェイスが可能になります。
-
フィールドのデフォルト値を簡単に指定することができます (
編集
: Python 3.7では
collections.namedtuple
が追加されました。defaults
キーワード が追加されたので、これはもはや利点ではありません。 ) - 型名を2回繰り返す必要はありません("Employee")。
- 型を直接カスタマイズできる (例: docstring やいくつかのメソッドを追加する)
前と同じように、あなたのクラスは
tuple
のサブクラスとなり、インスタンスは
tuple
のインスタンスになります。 興味深いことに、あなたのクラスは
NamedTuple
. その理由を知りたければ、実装の詳細について読んでみてください。
from typing import NamedTuple
class Employee(NamedTuple):
name: str
id: int
Python <= 3.8での挙動
>>> issubclass(Employee, NamedTuple)
False
>>> isinstance(Employee(name='guido', id=1), NamedTuple)
False
typing.NamedTuple
はクラスで、これは
メタクラス
とカスタム
__new__
を使ってアノテーションを処理し、それを
に委ねます。
collections.namedtuple
を構築して返すために、とにかく、型
. 小文字の名前の規則から推測されるように
collections.namedtuple
は型/クラスではなく、ファクトリー関数です。 これは Python のソースコードの文字列を構築し、次に
exec
を呼び出すことで動作します。は
生成されたコンストラクタは、名前空間から抜き出された
と
の 3 引数呼び出しに含まれます。
type
の3つの引数でクラスを構築して返します。これは、上で見た奇妙な継承の破綻を説明するものです。
NamedTuple
はメタクラスを使うことで
異なる
メタクラスを使用してクラスオブジェクトをインスタンス化します。
Pythonでの動作 >= 3.9
typing.NamedTuple
から変更されます。
class
から
def
.
>>> issubclass(Employee, NamedTuple)
TypeError: issubclass() arg 2 must be a class or tuple of classes
>>> isinstance(Employee(name="guido", id=1), NamedTuple)
TypeError: isinstance() arg 2 must be a type or tuple of types
による多重継承
NamedTuple
を使った多重継承は禁止されました(そもそも正常に動作していませんでした)。
関連
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] Pythonのリストメソッドであるappendとextendの違いは何ですか?
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] 億の相対的輸入
-
[解決済み] リストとタプルの違いは何ですか?
-
[解決済み】__str__と__repr__の違いは何ですか?
-
[解決済み] tensorflowのCPUのみのインストールでダイナミックライブラリ 'cudart64_101.dll' を読み込めなかった
-
[解決済み] matplotlib でプロットの軸、目盛、ラベルの色を変更する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] django.db.migrations.exceptions.InconsistentMigrationHistory
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] pandasのタイムゾーンに対応したDateTimeIndexを、特定のタイムゾーンに対応したナイーブなタイムスタンプに変換する。
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] 異なる順序で同じ要素を持つ2つのJSONオブジェクトを等しく比較するには?
-
[解決済み] Flask でグローバル変数はスレッドセーフか?リクエスト間でデータを共有するには?
-
[解決済み] pycharmがタブをスペースに自動変換する
-
[解決済み] Pythonの文字列書式をリストで使う
-
[解決済み] 単純な文字列からtimedeltaオブジェクトを作成する方法
-
[解決済み] 新しいpip backtrackingの実行時問題の解決