Python itertools: construir pipelines de iteradores perezosos

Python itertools: construir pipelines de iteradores perezosos

itertools es un módulo de la biblioteca estándar que expone bloques de iteración combinables. Su interés no está en sustituir un bucle for por una función de nombre críptico, sino en manipular flujos de datos sin cargarlos nunca por completo en memoria. Cada función devuelve un iterador perezoso: nada se calcula hasta que se consume el resultado. Eso es lo que permite encadenar transformaciones sobre millones de elementos con una huella de memoria constante. ...

29 de mayo de 2026 · 7 min · Anthony
ExitStack: varios patch() sin pirámide de with

ExitStack: varios patch() sin pirámide de with

Un test que debe aislar una función de sus dependencias acaba a menudo apilando llamadas a patch(). Tres dependencias, tres with anidados. Cinco dependencias, una pirámide que empuja el código útil diez niveles de indentación. El test se vuelve ilegible aunque su intención sea simple: verificar un solo comportamiento en una frontera precisa. contextlib.ExitStack resuelve exactamente este problema. Es un gestor de contexto que agrega un número cualquiera de otros y los cierra todos de forma limpia al salir. Así es como lo uso para mantener un test centrado en su frontera, con un caso concreto sobre la autenticación. ...

28 de mayo de 2026 · 7 min · Anthony
Capa anti-corrupción: aislar tu código de las APIs externas

Capa anti-corrupción: aislar tu código de las APIs externas

Consumir una API externa parece inofensivo al principio. Haces un requests.get, recibes un diccionario, y lo usas tal cual en el resto del código. El problema empieza cuando esa misma estructura JSON termina diseminada en diez archivos, y la API renombra un campo o cambia price de float a string. Corregirlo se convierte en una búsqueda del tesoro. La capa anti-corrupción (Anti-Corruption Layer, o ACL) responde a este problema. Procedente del Domain-Driven Design, actúa como un traductor entre un sistema externo y tu lógica de negocio. Un solo punto de contacto, un solo lugar que modificar cuando la API cambia. ...

27 de mayo de 2026 · 5 min · Anthony
Permisos declarativos en DRF con rest_access_policy

Permisos declarativos en DRF con rest_access_policy

Los permisos en Django REST Framework funcionan, pero muestran sus límites en cuanto las reglas de acceso se vuelven moderadamente complejas. Varios roles, objetos pertenecientes a un usuario específico, acciones custom en un ViewSet: acabas con clases has_permission y has_object_permission que mezclan verificaciones heterogéneas, difíciles de leer y aún más difíciles de testear. rest_access_policy (paquete djangorestframework-access-policy) propone un enfoque diferente: declarar las reglas de acceso como statements, similar a las políticas IAM de AWS. El resultado es legible de un vistazo, testeable independientemente del ViewSet, y extensible sin reescribir toda la clase. ...

26 de mayo de 2026 · 7 min · Anthony
Hash, HMAC y cifrado: cómo proteger un token en Django

Hash, HMAC y cifrado: cómo proteger un token en Django

Una comparación == sobre un hash no es suficiente para elegir el mecanismo correcto. sha256, HMAC, hash salado, cifrado: cada enfoque ofrece garantías distintas. Entender cuáles son cambia concretamente la forma de almacenar y verificar un token en Django. Hash simple import hashlib token_hash = hashlib.sha256(token.encode()).hexdigest() Un hash simple es determinista: la misma entrada siempre produce la misma salida. No interviene ningún secreto del servidor. Es imposible recuperar el token original a partir del hash (sha256 es una función unidireccional). Pero si alguien conoce o adivina el token, puede recalcular el hash y comparar. ...

25 de mayo de 2026 · 4 min · Anthony
Python collections : Counter, defaultdict, deque y más

Python collections : Counter, defaultdict, deque y más

El módulo collections forma parte de la biblioteca estándar de Python desde la versión 2.4. Proporciona estructuras de datos especializadas que resuelven problemas recurrentes sin ninguna dependencia externa. Sin embargo, muchos desarrolladores siguen escribiendo bucles de conteo, inicializaciones condicionales de claves, o clases Point con campos x, y, z cuando Counter, defaultdict y namedtuple hacen exactamente eso, mejor y de forma más legible. Aquí están las seis estructuras que utilizo regularmente, con los casos en los que realmente marcan la diferencia. ...

22 de mayo de 2026 · 7 min · Anthony
Python shutil: copiar, mover y archivar ficheros

Python shutil: copiar, mover y archivar ficheros

Cuando se necesita copiar un directorio, mover ficheros o crear un archivo comprimido en Python, la tentación es recurrir a subprocess.run(["cp", "-r", ...]) o os.system("mv ..."). Este enfoque es frágil, no portable e innecesario: shutil (shell utilities) está en la biblioteca estándar de Python desde la versión 2.3 y gestiona todo esto de forma limpia. La librería Python shutil es la herramienta de referencia para operaciones de alto nivel sobre el sistema de archivos. ...

21 de mayo de 2026 · 4 min · Anthony
Python operator: itemgetter, attrgetter y el arte de reemplazar las lambdas

Python operator: itemgetter, attrgetter y el arte de reemplazar las lambdas

La librería operator forma parte de la biblioteca estándar de Python desde siempre, y aun así muchos desarrolladores siguen escribiendo lambda x: x[0] o lambda obj: obj.nombre cuando una función de operator haría el mismo trabajo, de forma más rápida y más legible. Entender qué ofrece esta librería, y cómo está implementada, cambia la manera de escribir código funcional en Python. Qué contiene operator operator expone funciones que corresponden a los operadores del lenguaje. operator.add(2, 3) es el equivalente funcional de 2 + 3, operator.lt(a, b) corresponde a a < b. El interés no es reemplazar los operadores en código aritmético ordinario, sería absurdo. El interés es poder pasar una operación como argumento a una función de orden superior (map, filter, sorted, reduce, functools.partial). ...

20 de mayo de 2026 · 7 min · Anthony
Python dataclasses: field(default_factory) en profundidad

Python dataclasses: field(default_factory) en profundidad

Las dataclasses de Python generan automáticamente __init__, __repr__ y __eq__ a partir de las anotaciones de tipo. En cuanto un atributo necesita un valor por defecto mutable (lista, diccionario, conjunto), nos encontramos con un problema fundamental del lenguaje. field(default_factory=...) es la solución, y entender por qué es necesario cambia la forma en que razonamos sobre la inicialización en Python. La trampa de los valores mutables por defecto En Python, los valores por defecto de los parámetros de función se evalúan una sola vez en el momento de definición de la función, no en cada llamada. Esto es una propiedad del lenguaje, no un bug. ...

19 de mayo de 2026 · 5 min · Anthony
Django: save() no llama a full_clean() — ciclo de validación

Django: save() no llama a full_clean() — ciclo de validación

Llamar a obj.save() después de definir validators y un método clean() en el modelo da la impresión de que la validación está garantizada. No lo está. Django no llama a full_clean() durante un save(), y este comportamiento es deliberado. Entender por qué cambia la forma de diseñar la validación en un proyecto. Lo que save() hace realmente El ciclo de vida de un save() es más corto de lo que parece: ...

18 de mayo de 2026 · 5 min · Anthony

Newsletter

Recibe los nuevos artículos directamente en tu bandeja de entrada.

Sin spam. Baja en un clic.