`__init__`, `__repr__` y `__str__`: los dunders fundamentales
Qué hace realmente cada uno, cómo interactúan con `print()` y el REPL, y por qué `__repr__` es el mínimo que toda clase no trivial debe implementar.
Qué hace realmente cada uno, cómo interactúan con `print()` y el REPL, y por qué `__repr__` es el mínimo que toda clase no trivial debe implementar.
Los métodos __x__ son el contrato entre tus objetos y el intérprete; entenderlos te permite escribir clases que participan naturalmente en la sintaxis del lenguaje.
Cada valor en Python es una instancia de alguna clase, incluyendo funciones, clases y None. Entender las tres propiedades fundamentales de un objeto explica reflexión, metaclases y decisiones de diseño del lenguaje.
Cómo usar `NamedTemporaryFile`, `TemporaryFile` y `TemporaryDirectory` para evitar race conditions y limpiar recursos automáticamente.
Cómo usar pathlib.Path para construir, leer, escribir y explorar rutas del filesystem de forma legible y multiplataforma.
Cómo usar el iterador perezoso de file objects, chunks binarios y csv.reader para procesar archivos de gigabytes sin agotar la memoria.
Por qué `with open(…) as f:` garantiza que el archivo se cierra siempre, cómo funciona el protocolo `__enter__`/`__exit__`, y cómo manejar múltiples archivos en un solo bloque.
Modos r/w/a/x/b/+, por qué especificar encoding siempre, manejo de saltos de línea y métodos del file object.
Cómo ExceptionGroup agrupa fallos concurrentes y cómo except* los particiona por tipo sin descartar el resto, con el caso real de TaskGroup.
Diseña jerarquías de excepciones con atributos informativos, herencia correcta desde Exception y semántica clara para que el caller pueda reaccionar con precisión.