Python pythónico
53 pasos en 14 series de Python.
La diferencia entre Python que funciona y Python que se lee como Python. Primero las comprensiones, luego los decoradores y las clausuras que llevan debajo, los generadores y los itertools que los acompañan, y los protocolos dunder que hacen que tus propios objetos se comporten como los integrados.
Después la cosa se pone menos amable. Descriptores, __init_subclass__ y la maquinaria cercana a las metaclases, functools y operator, tipado más allá de lo básico, y async dos veces: una por la sintaxis y otra por los patrones que aparecen de verdad. No todo esto es código que deberías escribir. Todo esto es código que vas a leer.
Comprensiones
- Comprensiones de listasConstruir una lista a partir de un bucle en una sola expresión.
- Comprensiones de dicts y conjuntosLa sintaxis de comprensión, apuntada a dicts y conjuntos.
- Comprensiones anidadasComprensiones en dos dimensiones: rejillas y matrices.
- Expresiones generadorasComprensiones perezosas que calculan un elemento a la vez.
Decoradores y clausuras
- Clausuras y nonlocalFunciones internas que recuerdan y mutan estado exterior.
- Escribir un decoradorEnvolver una función para agregarle comportamiento alrededor.
- Decoradores con argumentosUna fábrica de decoradores: una capa más para aceptar parámetros.
- Decorador de memoizaciónLa memoización cambia memoria por velocidad — estándar para funciones puras costosas.
- Reintentos con backoffEl backoff exponencial es la forma cortés de reintentar llamadas inestables.
Generadores e itertools
- Pipelines de generadoresEncadenar generadores para que los datos fluyan por etapas perezosamente.
- yield fromDelegar la iteración a un subgenerador, para la recursión.
- El kit de itertoolsBloques de construcción de la biblioteca estándar para iteradores.
- itertools.groupbyColapsar elementos iguales consecutivos en grupos.
- reduce y partialDos básicos de functools: plegar y prellenar argumentos.
Protocolos y gestores de contexto
- Gestores con contextlibCrear gestores de contexto sin escribir una clase.
- Gestor de contexto para cronometrarLos gestores de contexto garantizan la limpieza; este mide el tiempo transcurrido.
- Métodos dunder de contenedorEnseñar a una clase a comportarse como un contenedor integrado.
- Sobrecarga de operadoresDarle a una clase significado para +, * y repr.
- ProtocolosTipado estructural: duck typing que el verificador de tipos entiende.
Tipado y dataclasses
- Anotaciones de tiposAnotar parámetros y retornos con tipos modernos.
- Dataclasses a fondoMás allá de lo básico: orden, valores por defecto y datos congelados.
- EnumsNombrar un conjunto fijo de constantes relacionadas con Enum.
- Dataclass con distanciaLas dataclasses recortan el código repetitivo de las clases de valores pequeñas.
Async
- async y awaitDefinir corrutinas y esperarlas en un bucle de eventos.
- asyncio.gatherCorrer muchas corrutinas concurrentemente y juntar los resultados.
- Timeouts asíncronosAcotar cuánto tiempo puede tardar un await.
- Colas de asyncioUn productor y un consumidor compartiendo una cola asíncrona.
Hilos y procesos
- Pools de hilosCorrer trabajo limitado por IO a través de un pool de hilos.
- LocksProteger el estado compartido para que los hilos no lo corrompan.
- Pools de procesosRepartir trabajo limitado por CPU entre núcleos de verdad.
- Futures según terminanReaccionar a los resultados en orden de término, no de envío.
Atributos y descriptores
- __slots__Declarar los atributos por adelantado elimina el dict por instancia.
- Propiedades con validaciónUna propiedad vuelve el acceso al atributo una llamada a método, así las invariantes se cumplen.
- DescriptoresEl protocolo debajo de las propiedades: __get__ y __set__ en un atributo de clase.
Maquinaria de clases
- Clases base abstractasLas ABC declaran la interfaz y se niegan a instanciarse hasta que se cumple.
- __init_subclass__Un hook que corre al definirse una subclase — un registro sin metaclase.
- Una metaclaseLa clase de una clase: corre al definirla y puede reescribirla.
functools y operator
- functoolspartial, reduce y cached_property: tres herramientas que vale la pena tener a mano.
- singledispatchUn solo nombre de función, y la implementación elegida por el tipo del primer argumento.
- El módulo operatorFunciones con nombre para los operadores, que le ganan a una lambda como clave de orden.
Tipado a fondo
- TypeVar y GenericUn parámetro de tipo deja que una clase o función conserve el tipo de quien llama.
- ProtocolosTipado estructural: cualquier cosa con los métodos correctos satisface el protocolo.
- TypedDict y NewTypeTipar la forma de un dict, y darle a un primitivo un nombre distinto.
- overloadVarias firmas para una función, para que el verificador sepa qué regresa.
Datos y enums
- Dataclasses, a fondofrozen, slots, fábricas de valores por defecto y __post_init__.
- Enums, a fondoauto, StrEnum y Flag cubren casi todo para lo que sirven los enums.
- Coincidencia estructural de patrones, a fondoPatrones de clase, guardas, y capturar el resto de un mapeo.
Async a fondo
- TaskGroupUna guardería de tareas: espera a todas y cancela el resto ante un error.
- Iteradores y administradores de contexto asyncLos gemelos async de los dos protocolos que ya conoces.
- Limitar la concurrenciaUn semáforo acota cuántas corrutinas están en la parte costosa a la vez.
- Grupos de excepcionesVarias fallas a la vez, y la sintaxis except* que las separa.
Bis
- async_crawler.pyConsultar muchas URLs concurrentemente y reportar tamaños y tiempos.
- parallel_hash.pyHashear cada archivo bajo un directorio con un pool de procesos.