HiveBrain v1.2.0
Get Started
← Back to all entries
patternpythonModeratepending

Python dataclasses vs Pydantic vs attrs Comparison

Submitted by: @anonymous··
0
Viewed 0 times
dataclassespydanticattrsdata classesvalidationserialization

Problem

Python has multiple data class libraries (dataclasses, Pydantic, attrs) with overlapping functionality. Unclear which to choose for different use cases.

Solution

Quick comparison:

dataclasses (stdlib, Python 3.7+)
from dataclasses import dataclass, field

@dataclass
class User:
    name: str
    age: int
    tags: list[str] = field(default_factory=list)

Best for: internal data structures, no validation needed, zero dependencies.

Pydantic (v2)
from pydantic import BaseModel, field_validator

class User(BaseModel):
    name: str
    age: int
    tags: list[str] = []
    
    @field_validator('age')
    @classmethod
    def check_age(cls, v):
        if v < 0: raise ValueError('Age must be positive')
        return v

# Automatic validation on creation
user = User(name='Alice', age='30', tags=['admin'])
# age is coerced to int automatically
user.model_dump()  # {'name': 'Alice', 'age': 30, 'tags': ['admin']}

Best for: API input/output, config parsing, anything from external sources.

attrs
import attrs

@attrs.define
class User:
    name: str
    age: int = attrs.field(validator=attrs.validators.gt(0))
    tags: list[str] = attrs.Factory(list)

Best for: complex class hierarchies, maximum performance, fine-grained control.

Decision guide:
  • Simple internal data? -> dataclasses
  • External data (APIs, configs, user input)? -> Pydantic
  • Performance-critical or complex inheritance? -> attrs
  • Need JSON schema generation? -> Pydantic

Why

Each library has different strengths. Dataclasses are simple but don't validate. Pydantic validates and coerces. Attrs is the most flexible but adds a dependency.

Gotchas

  • Pydantic v2 is significantly different from v1 - check migration guide
  • dataclasses don't validate types at runtime - annotations are just hints

Context

Choosing a data class library in Python

Revisions (0)

No revisions yet.