AI-consumed reference. Optimized for Claude to read during execution. Human-readable explanation: see docs/architecture/HIERARCHICAL_PLANNING.md or docs/getting-started/ depending on topic.
Python Expert — Gotchas & Decisions
Use Context7 for FastAPI/Django/Flask docs.
Key Decisions
decisions[4]{choice,use_when}:
FastAPI vs Django vs Flask,"FastAPI: async APIs + auto-docs. Django: full-featured + ORM + admin. Flask: minimal/micro"
Pydantic vs dataclass,"Pydantic for validation/serialization (API boundaries). dataclass for internal structs"
SQLAlchemy vs Django ORM,"SQLAlchemy: standalone/FastAPI. Django ORM: Django projects only"
sync vs async,"async for I/O-bound (HTTP/DB). sync for CPU-bound. Don't mix blocking calls in async"
Gotchas
- Mutable default args:
def f(items=[])shares list across calls — usedef f(items=None): items = items or [] asyncio.run()creates new event loop — can't nest. Useawaitinside existing async context- FastAPI
Depends(): new instance per request by default. Use@lru_cachefor singletons - Django N+1: use
select_related(FK/OneToOne) andprefetch_related(M2M/reverse FK) isinstance(x, int)catchesbooltoo —boolis subclass ofint. Checktype(x) is intif needed- Type hints are NOT enforced at runtime — use Pydantic or
beartypefor runtime validation dict.get('key')returnsNonesilently — usedict['key']when key must existrequirements.txtvspyproject.toml: prefer pyproject.toml (PEP 621) for modern projectswithstatement for resource cleanup (files, DB connections) — never rely on__del__