2015年11月3日

collections.namedtuple

collectionsライブラリには様々な有用な型が定義されています。
ここでは collections.namedtuple を紹介します。

namedtuple とは、tuple を拡張したもので、変数をまとめるだけの簡単なクラス(のようなもの)を手軽に作成することができます。

型の定義は以下のように行います。

# Pointという名前のnamedtupleを定義。
# 変数としてx, y, zを持つ
>>> from collections import namedtuple
>>> Point = namedtuple('Point',
...                    ['x', 'y', 'z'])


このような定義することで、あたかも x, y, z というメンバ変数を持つ Pointクラス(のようなもの)を作成できます。
# Point変数を新規作成
>>> p = Point(10, 20, 30)

# x, y, zにメンバ変数のようにアクセスできる
>>> p.x
10
>>> p.y
20
>>> p.z
30


注意点として、あくまで tuple ですので要素の変更は許可されません。
# 要素の変更はできない
>>> p.x = 11
Traceback (most recent call last):
  File "", line 1, in 
AttributeError: can't set attribute


要素を変更したい場合、変更そのものはできないので、変数の新規作成を行う必要があります。
型名を指定して新規作成する方法と、_replace()を利用する方法があります。
# 新規作成で x のみ変更
>>> p = Point(11, p.y, p.z)
>>> p
Point(x=11, y=20, z=30)

# _replace()で x のみ変更した値を再代入
>>> p = p._replace(x=12)
>>> p
Point(x=12, y=20, z=30)


クラスと比べるとずっと手軽に定義でき、list や tuple と比べると要素の意味が把握しやすい、というのが namedtuple の特徴と言えます。
クラスを定義するほどでもない小さなデータをまとめる場合に便利です。是非使いこなしましょう。

0 件のコメント:

コメントを投稿