Python の「名前付きタプル」とは何ですか? 質問する

Python の「名前付きタプル」とは何ですか? 質問する
  • 名前付きタプルとは何ですか? また、どのように使用しますか?
  • 通常タプルの代わりに名前付きタプルを使用する必要があるのはいつですか、またはその逆ですか?
  • 「名前付きリスト」もありますか? (つまり、変更可能な名前付きタプル)

最後の質問については、以下も参照してください。Python に変更可能な名前付きタプルが存在するか?

ベストアンサー1

名前付きタプルは、基本的に簡単に作成できる軽量のオブジェクト型です。名前付きタプルのインスタンスは、オブジェクトのような変数参照または標準のタプル構文を使用して参照できます。これらは、struct不変であることを除いて、または他の一般的なレコード型と同様に使用できます。これらはPython 2.6とPython 3.0で追加されましたが、Python 2.4 での実装レシピ

たとえば、ポイントをタプルとして表現するのは一般的です(x, y)。これは次のようなコードになります。

pt1 = (1.0, 5.0)
pt2 = (2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)

名前付きタプルを使用すると、読みやすくなります。

from collections import namedtuple
Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
line_length = sqrt((pt1.x-pt2.x)**2 + (pt1.y-pt2.y)**2)

ただし、名前付きタプルは通常のタプルと下位互換性があるため、次のコードも引き続き機能します。

Point = namedtuple('Point', 'x y')
pt1 = Point(1.0, 5.0)
pt2 = Point(2.5, 1.5)

from math import sqrt
# use index referencing
line_length = sqrt((pt1[0]-pt2[0])**2 + (pt1[1]-pt2[1])**2)
 # use tuple unpacking
x1, y1 = pt1

したがって、オブジェクト表記法によってコードがより Python らしくなり、読みやすくなると思われる場合は、タプルではなく名前付きタプルを使用する必要があります。私は個人的に、特に関数にパラメータとして渡すときに、非常に単純な値型を表すために名前付きタプルを使い始めました。これにより、タプル パッキングのコンテキストを見なくても、関数が読みやすくなります。

さらに、関数を持たずフィールドのみを持つ通常の不変クラスを置き換えることもできます。名前付きタプル型を基本クラスとして使用することもできます。

class Point(namedtuple('Point', 'x y')):
    [...]

ただし、タプルと同様に、名前付きタプル内の属性は不変です。

>>> Point = namedtuple('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
AttributeError: can't set attribute

値を変更したい場合は、別の型が必要です。便利なレシピがあります。変更可能なレコードタイプ属性に新しい値を設定できます。

>>> from rcdtype import *
>>> Point = recordtype('Point', 'x y')
>>> pt1 = Point(1.0, 5.0)
>>> pt1 = Point(1.0, 5.0)
>>> pt1.x = 2.0
>>> print(pt1[0])
    2.0

ただし、新しいフィールドを追加できる「名前付きリスト」の形式は知りません。この状況では、辞書を使用するだけでよいかもしれません。名前付きタプルは、pt1._asdict()which を返すことで辞書に変換でき{'x': 1.0, 'y': 5.0}、通常のすべての辞書関数を使用して操作できます。

すでに述べたように、ドキュメントを確認するこれらの例が作成された理由の詳細については、こちらをご覧ください。

おすすめ記事