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
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
Python __add__ e __iadd__: copia o mutación en lugar

Python __add__ e __iadd__: copia o mutación en lugar

__add__ e __iadd__ definen dos comportamientos distintos para la adición en Python: uno crea un nuevo objeto, el otro modifica el existente. Esta distinción tiene consecuencias reales sobre los alias y las referencias compartidas, y sorprende incluso a desarrolladores experimentados. add: la adición que crea __add__ es invocada por el operador +. Debe retornar un nuevo objeto y dejar los operandos sin cambios. class Vector: def __init__(self, x, y): self.x = x self.y = y def __add__(self, other): return Vector(self.x + other.x, self.y + other.y) a = Vector(1, 2) b = Vector(3, 4) c = a + b # nuevo Vector(4, 6) print(a.x, a.y) # 1 2 — a no cambia print(id(a) == id(c)) # False — objetos distintos a + b llama a a.__add__(b). Si __add__ no está definido en a o retorna NotImplemented, Python intenta b.__radd__(a). ...

15 de mayo de 2026 · 4 min · Anthony
Python @property: de la encapsulación a los descriptores

Python @property: de la encapsulación a los descriptores

Acceder a r.width y escribir r.width = 15 con la misma sintaxis que un atributo normal, mientras se ejecuta validación o cálculo por debajo: eso es lo que @property aporta. Y cuando esa lógica necesita compartirse entre varias clases, los descriptores entran en juego. @property: getters y setters sin fricción @property permite exponer un atributo calculado o validado con la misma sintaxis que un atributo simple. class Rectangle: def __init__(self, width: float, height: float): self._width = width self._height = height @property def width(self) -> float: return self._width @width.setter def width(self, value: float) -> None: if value <= 0: raise ValueError("El ancho debe ser positivo.") self._width = value @property def area(self) -> float: return self._width * self._height El beneficio concreto: la API pública no cambia. Añadir validación a un atributo existente no rompe ningún código llamador. @property sin setter crea un atributo de solo lectura. @nombre.deleter gestiona la eliminación con del. ...

12 de mayo de 2026 · 3 min · Anthony
Python __slots__: reduce la memoria de tus instancias entre un 40 y un 60%

Python __slots__: reduce la memoria de tus instancias entre un 40 y un 60%

Por defecto, Python asigna un diccionario __dict__ a cada instancia de una clase. Es flexible, sí. Pero cuando se tienen miles o millones de objetos en memoria al mismo tiempo, ese coste se acumula rápidamente. __slots__ elimina ese diccionario y reemplaza el almacenamiento por instancia con descriptores internos más compactos. Resultado típico: entre un 40 y un 60 por ciento menos de memoria por instancia. Lo que hace Python sin slots Sin ninguna declaración especial, cada instancia lleva su propio __dict__: ...

6 de mayo de 2026 · 4 min · Anthony

Newsletter

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

Sin spam. Baja en un clic.