`contextlib.contextmanager`: context managers con generadores
Cómo convertir una función generadora con un único `yield` en un context manager completo, con manejo correcto de excepciones y casos reales de uso.
Cómo convertir una función generadora con un único `yield` en un context manager completo, con manejo correcto de excepciones y casos reales de uso.
Cómo Python llama `__enter__` y `__exit__` en un bloque `with`, qué significan los tres argumentos de excepción y cuándo retornar `True` para suprimir errores.
Implementación y análisis de decoradores de producción: caché, timing, logging, retry con backoff, validación de argumentos y registro de rutas en frameworks web.
Cómo usar una clase con __call__ como decorador para gestionar estado complejo, y cómo decorar clases para modificarlas directamente.
Cómo y por qué los decoradores parametrizados requieren tres niveles de anidación, con alternativas usando clases y partial.
Sin `@wraps`, el wrapper oculta nombre, docstring y anotaciones de la función original; `functools.wraps` los restaura en una línea.
Un decorador es una función que recibe y retorna otra función; `@d` sobre `def f` es exactamente `f = d(f)`, aprovechando que las funciones son objetos de primera clase.
Cómo usar `lru_cache` y `cache` para memoizar funciones puras, manejar argumentos hashables y evitar memory leaks en métodos de instancia.
Cómo usar `partial` para prefijar argumentos, adaptar firmas y crear callables reutilizables sin lambdas opacas.
Qué es una lambda, sus limitaciones de diseño y cómo distinguir los casos donde ayuda de los antipatrones que la convierten en ruido.