Pythonで名前付きタプルを使う(collections.namedtuple, typing.NamedTuple (Python 3.6以降))
この記事ではPythonで名前付きタプルを使う方法を解説します。collections.namedtupleとtyping.NamedTupleの使い分けや利点、そして実践的なサンプルコードを紹介します。
目次
collections.namedtuple
Pythonの標準ライブラリ`collections`モジュールにある`namedtuple`は、名前付きタプルを作成するための関数です。タプルの各要素に名前をつけることで、コードの可読性と保守性を向上させることができます。
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p) # Output: Point(x=10, y=20)
print(p.x) # Output: 10
print(p.y) # Output: 20
第一引数はクラス名、第二引数はフィールド名のリストです。
namedtupleで作成されたクラスは、タプルと同様にインデックスアクセスも可能です。
print(p[0]) # Output: 10
print(p[1]) # Output: 20
typing.NamedTuple
Python 3.6以降では、`typing`モジュールに`NamedTuple`が追加されました。`namedtuple`と同様に名前付きタプルを作成できますが、型ヒントを指定できる点が大きな違いです。
from typing import NamedTuple
class Point(NamedTuple):
x: int
y: int
p = Point(10, 20)
print(p) # Output: Point(x=10, y=20)
print(p.x) # Output: 10
print(p.y) # Output: 20
型ヒントを指定することで、静的解析ツールによるエラー検出が可能になり、より安全なコードを作成できます。
NamedTupleは、namedtupleと比べて、より柔軟で高度な機能を提供します。例えば、デフォルト値を指定したり、メソッドを追加したりできます。
使い分け
`namedtuple`はシンプルな名前付きタプルを作成するのに適しており、型ヒントを必要としない場合に使用します。一方、`NamedTuple`は型ヒントが必要な場合や、より高度な機能が必要な場合に使用します。型安全性を重視するならば、`NamedTuple`を使うべきです。
利点
名前付きタプルを使う利点は、コードの可読性と保守性の向上です。タプルの各要素に名前をつけることで、コードの意味が明確になり、デバッグや修正が容易になります。また、型ヒントを使用することで、ランタイムエラーを事前に防ぐことができます。
サンプルコード
より実践的な例として、ユーザー情報を表す名前付きタプルを考えてみましょう。
from typing import NamedTuple
class User(NamedTuple):
id: int
name: str
email: str
user = User(1, 'John Doe', 'john.doe@example.com')
print(user.name) # Output: John Doe
print(user.email) # Output: john.doe@example.com