Decoradores con argumentos: la triple anidación explicada
Cómo y por qué los decoradores parametrizados requieren tres niveles de anidación, con alternativas usando clases y partial.
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.
Cuándo las funciones de orden superior son idiomáticas y cuándo las comprehensions ganan en claridad; uso correcto de `reduce` y el módulo `operator`.
Cómo `yield from` delega iteración y reenvía send, throw y close al subgenerador activo, y cómo capturar su valor de return.
Cómo los tres métodos del protocolo de generador habilitan comunicación bidireccional y convierten cualquier función con yield en una corrutina primitiva.
Cómo `yield` convierte una función en una máquina de estados y qué ocurre realmente en cada llamada a `next()`.