0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】Python の「データクラス三強」dataclass vs Pydantic vs attrs

0
Posted at

はじめに

Python の「データクラス三強」を徹底比較する

Python で “データを扱うクラス” を作るとき、
最も有名な選択肢はこの 3 つ:

  • dataclass(標準ライブラリ)
  • Pydantic(データ検証 + バリデーションの王者)
  • attrs(高速・柔軟・カスタマイズ性最強の実力派)

結論を一言でいうと:

迷ったら dataclass
API・設定管理なら Pydantic
パフォーマンス・柔軟性なら attrs

だけど、細かいところまで知っておくと選択の質がぜんぜん違う。
この記事では「どれが何に強いのか」を徹底比較します。


まずはざっくり比較表

機能 dataclass Pydantic v2 attrs
標準ライブラリ
バリデーション 弱い 最強 カスタムで対応
速度 速い かなり速い 最速級
記述量 最小 中くらい 中くらい
型チェックとの相性 良い とても良い とても良い
イミュータブル frozen=True model_config frozen=True
辞書/JSON 変換 弱め 最強 普通
学習コスト 最低 中〜高
用途 軽量データ構造 API / 設定 / JSON 大規模データ構造、柔軟な OOP

1. dataclass — 標準ライブラリの王道

特徴

  • Python 標準ライブラリ(追加インストール不要)
  • 最軽量でシンプル
  • __init__, __repr__, __eq__ を自動生成
  • バリデーションは自分で書く必要あり

サンプル

from dataclasses import dataclass

@dataclass
class User:
    id: int
    name: str

強み

  • 速い
  • シンプル
  • 標準ライブラリで安心

弱み

  • バリデーションが弱い
  • JSON などの外部データを扱うのは苦手

向いている

  • DTO
  • 小規模の構造体
  • “値” を表すクラス(Position, Result, Settings)

2. Pydantic — バリデーション & モデルの王者(FastAPI の心臓)

Pydantic v2 は特に性能が爆上がりしており、
Python で外部データを扱うならほぼ最強の選択肢。

特徴

  • 型ヒントを使って自動バリデーション
  • JSON 変換・Dict 化がとても強い
  • FastAPI のデフォルトモデル(業界標準)
  • 設定クラス・環境変数ロードにも最適

サンプル

from pydantic import BaseModel

class User(BaseModel):
    id: int
    name: str

u = User(id="10", name="Anna")
# id は自動で int にキャストされる

強み

  • バリデーションが圧倒的に強い
  • JSON 入出力が神
  • API / Web系に最高の相性
  • v2 でとにかく速い

弱み

  • 依存追加になる
  • dataclass よりは重い
  • 素朴な OOP クラスとしてはやや拡張しづらい

向いている

  • API リクエスト/レスポンスモデル
  • 設定ファイル(.env, JSON)
  • スキーマが明確なデータ処理

3. attrs — 柔軟性と性能のバランスが神

attrs はデータクラス界の “職人”。
細かい挙動を調整でき、速度も速く、大規模プロジェクトほど力を発揮する。

特徴

  • dataclass より高速 & 機能豊富
  • バリデーションも hook で簡単に追加可能
  • 不変モデル・変換処理・slots 最適化が強い
  • とにかく“設計の自由度”が高い

サンプル

import attrs

@attrs.define
class User:
    id: int
    name: str

強み

  • パフォーマンス最速級
  • 柔軟性が高く、細かい設定ができる
  • 大規模プロジェクトで真価を発揮

弱み

  • 標準ではない
  • 学習コストは dataclass より高め

向いている

  • 超大量データを扱うシステム
  • より高度な OOP + データモデリング
  • 広い拡張性が必要なプロジェクト

4. 実際にどれを使うべき?(用途別最適解)

API / Web / JSON

Pydantic 一択
バリデーション・変換・エラーメッセージが全部強い。

シンプルな DTO / 値クラス

dataclass
軽くて速い。標準ライブラリで十分。

大規模・高性能・カスタム性

attrs
より本格的なソフトウェア設計で大活躍。

設定ファイル

  • 高速・シンプル:dataclass
  • 環境変数・JSON・API連携:Pydantic

“型安全 × 柔軟性”

→ attrs
OOP の柔軟性は三者の中で最強。


5. 実例で比較 — JSON のロード

dataclass

import json
data = json.loads('{"id": 1, "name": "Anna"}')
user = User(**data)

手動でロードして展開が必要。


Pydantic

user = User.model_validate_json('{"id": 1, "name": "Anna"}')

はい最強。


attrs

data = json.loads('{"id": 1, "name": "Anna"}')
user = User(**data)

dataclass と同様、JSON 自体は自分でパースする必要あり。


まとめ

選ぶ基準 オススメ
標準ライブラリ dataclass
とにかく速い attrs
JSON / バリデーション Pydantic
シンプルなデータ構造 dataclass
強い OOP と拡張性 attrs
Web API Pydantic
設定クラス Pydantic または dataclass

最終判断のコツ:

  • “データが外部由来なら Pydantic”
  • “内部の構造体なら dataclass”
  • “高度な設計なら attrs”

この三角形のどこに自分のプロジェクトがいるかで決めるのがベスト。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?