python typing · by Adrian Benavides · August 6, 2026 · 8 min read
Frozen dataclasses are the default for domain value objects, but they don't validate at runtime. msgspec.Struct closes that gap with a single type that decodes, validates, and stays immutable across the wire boundary and the domain layer. attrs and cattrs cover the same ground in two libraries, and pydantic only earns its place when the ecosystem integration matters.
python architecture · by Adrian Benavides · August 3, 2026 · 5 min read
Use contextvars.ContextVar for cross-cutting concerns that almost every service needs, without threading them through every constructor. Covers per-task isolation, structlog and opentelemetry designs, sync-vs-async leaks, and the failure modes that show up in production.
python architecture · by Adrian Benavides · July 30, 2026 · 7 min read
Constructor-based dependency injection in Python: Composition Roots, pydantic-settings, and safe resource lifecycle management.
python architecture · by Adrian Benavides · July 24, 2026 · 10 min read
Import Linter enforces Python architectural boundaries at near-zero runtime cost. Benchmarked on three real OSS codebases (10k, 20k, 200k lines of Python).
python architecture · by Adrian Benavides · July 10, 2026 · 10 min read
Build decoupled, testable Python systems with Hexagonal Architecture. Covers ports, adapters, driven/driving roles, structural typing with Protocol, and the pitfalls of port proliferation, primitive obsession, and infrastructure leakage.
python architecture · by Adrian Benavides · July 2, 2026 · 12 min read
Apply DDD tactical patterns in Python with immutable value objects, aggregate roots, and bounded contexts (the modular monolith default, the modern tooling landscape, and when DDD is overkill).