Initial extracted documentation set
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
# CPython source notes
|
||||
|
||||
Repo: `python/cpython`
|
||||
Local checkout: `/home/ubuntu/repos/rodin-sources/cpython`
|
||||
|
||||
## Why this repo is useful
|
||||
- CPython is a strong source for patterns that survive long-term compatibility pressure.
|
||||
- It is especially useful for API-boundary choices and error-shape choices because stdlib modules must stay understandable to a huge caller base.
|
||||
- Caveat: stdlib code is not stylistically uniform. Treat repeated shapes across modules as signal; do not treat a single module's convention as "the Python way."
|
||||
|
||||
## Public API boundaries are often declared explicitly
|
||||
|
||||
### Repeated evidence
|
||||
- `Lib/operator.py:13-20` declares a tight `__all__` list instead of exporting every helper or alias in the module namespace.
|
||||
- `Lib/smtplib.py:55-58` does the same for the SMTP module, listing public exceptions and the `SMTP` client.
|
||||
- `Lib/warnings.py:3-18` likewise enumerates the supported warning helpers instead of relying on incidental module globals.
|
||||
|
||||
### Why it matters
|
||||
Repeated signal: when a module has helper names, aliases, or internal scaffolding, CPython often freezes the supported surface explicitly. That makes the public API a maintained decision rather than an accident of file layout.
|
||||
|
||||
### Caveat / counterexample
|
||||
This is common, not universal. Some stdlib modules still expose names without a curated `__all__`, so the useful pattern is not "always add `__all__`" but "use it when the file contains more than the intended public surface."
|
||||
|
||||
## Exception trees are shaped around recovery needs, not just taxonomy
|
||||
|
||||
### Repeated evidence
|
||||
- `Lib/smtplib.py:69-71` defines `SMTPException` as the broad catch point for the module.
|
||||
- `Lib/smtplib.py:73-86` adds semantic subtypes for unsupported commands and disconnected-session failures.
|
||||
- `Lib/smtplib.py:88-100` defines `SMTPResponseException` and stores structured payload on the exception itself via `smtp_code` and `smtp_error`.
|
||||
- `Lib/smtplib.py:102-125` and `Lib/smtplib.py:128-142` narrow further into sender, recipient, data, connect, HELO, and auth failures.
|
||||
|
||||
### Why it matters
|
||||
Repeated signal: CPython exception trees usually give callers two useful options at once:
|
||||
- catch broadly at the subsystem boundary, or
|
||||
- branch narrowly on structured failure data when recovery differs.
|
||||
|
||||
This is stronger than a flat set of unrelated exception classes and stronger than raising plain `OSError`/`ValueError` with message parsing.
|
||||
|
||||
## Resource-owning helpers usually make lifetime visible
|
||||
|
||||
### Repeated evidence
|
||||
- `Lib/contextlib.py:31-43` defines the abstract context-manager protocol directly in the stdlib.
|
||||
- `Lib/tempfile.py:487-539` wraps temporary files so `__enter__` returns the wrapper and `__exit__` guarantees cleanup.
|
||||
- `Lib/tempfile.py:758-761` also guards context entry on closed temporary files, showing that lifetime rules are enforced, not just documented.
|
||||
|
||||
### Why it matters
|
||||
Repeated signal: when a stdlib helper owns cleanup-sensitive state, CPython prefers explicit context-manager boundaries over ambient cleanup assumptions.
|
||||
|
||||
## Pattern candidates supported by this repo
|
||||
- declare public module surfaces explicitly when helper names would otherwise leak
|
||||
- build exception hierarchies around caller recovery paths
|
||||
- attach structured data to exceptions when callers need to branch without string parsing
|
||||
- make resource lifetime obvious with context-manager boundaries
|
||||
Reference in New Issue
Block a user