
Sign up to save your podcasts
Or


Participantes:
Jesús Cea, email: [email protected], twitter:
Víctor Ramírez, twitter: @virako,
Javier, conectando desde Madrid.
Miguel Sánchez, email:
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Prólogo:
FOSDEM https://fosdem.org/.
Escuchar audios previos para ver errores y comentar
[03:07] ¡Tenemos un voluntario para editar el podcast!
Detalles de cómo grabamos las tertulias.
Todo se graba en una sola pista :-(.
RNNoise: https://people.xiph.org/~jm/demo/rnnoise/.
Ideas para automatizar el proceso.
[09:17] Aviso legal de que se está grabando el sonido y que se
[11:22] Errata de la tertulia anterior: No, pipenv
[13:07] Tormenta de ideas
Las bibliotecas solo se cargan una vez en el programa,
sys.modules
Dependencias transitivas.
Subintérpretes Python. PEP 554:
Módulos en C: PEP 489 -- Multi-phase extension module
[22:17] Python 3.10a5. PEP 636 -- Structural Pattern Matching:
¡Más sintaxis nueva!
PEP 617 -- New PEG parser for CPython
[23:57] Nuitka https://nuitka.net/.
[26:02] Volvemos a "Structural Pattern Matching"
[27:32] Lo importante que fue la modernización de los tutoriales
PEP 414 -- Explicit Unicode Literal for Python 3.3
Jesús Cea opina que la migración de Python 2 a Python 3
[30:22] PEP 8 https://www.python.org/dev/peps/pep-0008/.
¿Ajustarse estrictamente a 80 columnas?
Flake8: https://pypi.org/project/flake8/.
[33:22] Mucho cuidado con "python-ideas"
Tabulación de código.
La anotación de tipos puede gustar o no, pero de momento es
Tema recurrente: ¿Qué es ser pythonico?
[35:12] Ventajas de anotar tipos.
Origen de MYPY: http://mypy-lang.org/.
Aportar información al IDE
Valor a la hora de documentar los tipos en los API
[39:52] Cryptography https://cryptography.io/en/latest/ y
[41:27] Digresión sobre systemd
[45:07] El peso de la web está moviéndose otra vez al backend.
El cliente web solo envía eventos al servidor y recibe
Abre la posibilidad olvidarnos de JavaScript:
ItsNat: https://en.wikipedia.org/wiki/ItsNat.
[51:02] splash https://pypi.org/project/splash/.
[56:07] Integrar Python en otros programas y demonios.
[57:07] PyOxidizer
Interactuar con otros lenguajes.
Python en Java, interactuando sin dolor: Jython
[59:52] ¿Cómo empezamos en Python?
Valor de Python como lenguaje fácil de entender y
Tutorial de Python:
bc -l https://linux.die.net/man/1/bc.
[01:05:07] Modificación atómica de ficheros.
En Unix se suele hacer: write + flush + rename.
MS Windows eso no funciona.
Python 3.3 añadió os.replace()
En MS Windows es atómico... casi siempre: Issue8828: Atomic
[01:10:02] Combinar fork e hilos en Python es una receta para el
fork:
multiprocessing:
[01:11:37] Decorador @overload
@functools.singledispatch
¿Qué se ve cuando salta una excepción?
Especializaciones.
Cython https://cython.org/.
[01:17:00] AnyIO
[01:18:12] "lxml soporta xpath".
Hilo en la lista de correo: "[Python-es] Biblioteca XPATH"
lxml: https://lxml.de/.
beautifulsoup4: https://pypi.org/project/beautifulsoup4/.
XPath: https://es.wikipedia.org/wiki/XPath.
Scrapy: https://scrapy.org/.
El buscador de PyPI https://pypi.org/ funciona fatal a la
[01:20:02] El valor de estudiar el código fuente ajeno no solo
Es la documentación última.
Los tests son muy útiles para saber cómo se usa el producto.
[01:22:02] ¿Cómo gestionáis la paginación cuando los datos del
Brainstorming de diversas estrategias.
Berkeley DB: https://pypi.org/project/berkeleydb/.
lmdb: https://pypi.org/project/lmdb/.
Multiversion concurrency control:
Copy on Write:
Snapshot:
BTree: https://es.wikipedia.org/wiki/%C3%81rbol-B.
PostgreSQL: https://www.postgresql.org/.
ZFS:
Normalización y formas normales:
[01:48:42] FOSDEM https://fosdem.org/:
Virako recomienda las siguientes:
Some SQL Tricks of an Application DBA - Non-trivial tips for
Database Disasters and How to Find Them
Practical advice for using Mypy - Hidden gems in the typing
Escaping the Cargo Cult - How to structure your project
[01:52:02] Charla Python Madrid https://www.python-madrid.es/.
[01:54:27] Comentado en la tertulia de la semana pasada: Bugs
Se trata de un problema conocido.
Ejemplo de código: https://pastebin.com/vGM1sh8r.
Issue24676: Error in pickle using cProfile
Issue9914: trace/profile conflict with the use of
Issue9325: Add an option to pdb/trace/profile to run library
[02:00:42] Que te cuenten lo que no funciona es mucho más
[02:02:52] Whoosh:
[02:05:48] Final.
En este audio hay un hablante que no identifico. ¿Quien es?. Es
Participantes:
Jesús Cea, email: [email protected], twitter:
Víctor Ramírez, twitter: @virako,
Dani, conectando desde Málaga.
Eduardo Castro, email:
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Preámbulo.
Design of CPython’s Garbage Collector:
Dificultades con el horario de la tertulia.
Problemas para publicar los audios.
Editar es un infierno.
Las notas de los audios tienen una importancia
Dinámica de las tertulias.
[08:32] Presentaciones.
Raspberry Pi Pico:
Micropython: https://www.micropython.org/.
[13:32] El aviso legal para poder grabar los audios.
[14:32] Bugs sobre "pickle"
Se trata de un problema conocido.
Ejemplo de código: https://pastebin.com/vGM1sh8r.
Issue24676: Error in pickle using cProfile
Issue9914: trace/profile conflict with the use of
Issue9325: Add an option to pdb/trace/profile to run library
[16:27] Lo importante que es abrir bugs, para que puedan
[18:12] Nueva versión de MYPY http://mypy-lang.org/ y MYPYC
Sigue fallando mucho.
[20:42] pyannotate https://pypi.org/project/pyannotate/ para
[22:52] Puedes usar tipos o no. Son opcionales. Ventajas en
Linter: https://es.wikipedia.org/wiki/Lint.
Impone disciplina y una cultura.
Las anotaciones de tipos no se verifican en tiempo de
Una de la ventaja de los "__slots__" es que si te
"pyannotate" https://pypi.org/project/pyannotate/.
Las anotaciones de tipos te permiten luego compilar Python
Las anotaciones se pueden meter en el mismo código o en un
Usar un fichero "compañero" es útil para poder usar
Evitar "contaminar" el sistema de control de versiones
Que los creadores de código y los etiquetadores de tipos
"typeshed": Collection of library stubs for Python, with
¿Y meter tipos en los comentarios, como se hacía
Hay mucha literatura de ingeniería de software sobre si es
[40:17] Python podría ser mucho más rápido aunque no se usen
Descubrimiento de tipos en tiempo de ejecución.
Tema recurrente.
Numba: https://numba.pydata.org/.
Javascript V8:
[43:06] Habiendo tantos compiladores, ¿por qué no se integra
Complejidad y compatibilidad.
Faltan manos.
Hay muchos "gérmenes" que no germinan.
Dispersión de esfuerzos.
[46:12] Puntos de dolor de Python para la gente que viene de
Tipos.
Velocidad.
Espacios significantes.
[46:37] ¿Qué es "Python"?
Cada novedad de sintaxis de Python cambia el lenguaje. ¿Qué
Hay organizaciones grandes que un lenguaje sin tipos ni
[51:22] Cultura común en todos los proyectos Python. Baja
La cultura va evolucionando.
Solución de compromiso: Meter tipos solo en la frontera.
[53:02] El tipado avanzado de Python 3.9 da un error de sintaxis
[54:46] El operador morsa no se puede usar dentro de un "list
No queda otra que escribirlo como:
duplicando el i.strip().
[56:40] En versiones de Python anteriores a 3.8 no se podría
When a return, break or continue statement is executed in
[57:47] f-string con datetime
[59:22] Modo depuración en f-strings en Python 3.8:
Útil para el loging.
[01:00:47] Versiones fijas de dependencias y actualizar un
Herramientas para esto: "pip"
"pipenv" https://pypi.org/project/pipenv/.
"Poetry": https://pypi.org/project/poetry/.
Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.
Paralelismos con el enlazado estático y dinámico.
[01:14:22] ¿Por qué se ha instalado este paquete, qué paquetes
pip show.
Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.
[01:19:22] Visualizar el grafo de versiones de un sistema de
[01:23:07] Recogida de basuras:
Design of CPython’s Garbage Collector:
Hora de sacar la basura garbage collector - Pablo Galindo y
La recolección de basura de la generación más antigua
[01:31:37] Divagación: Powerball https://powerball.org.uk/.
[01:31:52] Explicación de cómo funciona "__slots__"
[01:34:22] Libro "CPython Internals":
Website de "Real Python": https://realpython.com/. Merece
También tienen podcast: "The Real Python Podcast: Python
[01:36:42] Más sobre "__slots__"
Técnica estándar.
Un diccionario vacío ocupa 64 bytes: sys.getsizeof({}).
Se puede usar para evitar errores mecanográficos al escribir
[01:38:52] "AutoScraper: A Smart, Automatic, Fast and
[01:43:02] Librería para dibujar grafos: graphviz
Le das un texto describiendo nodos y conexiones entre nodos
Sería trivial para dibujar el grafo de dependencias de
Ejemplo:
El gráfico de antes, con ciclos:
El gráfico de después, sin ciclos:
[01:47:22] ¿Cómo asegurarse que el nombre de un fichero no tenga
Expresiones regulares. Cuidado con el unicode
Usar pathlib.is_relative_to()
[01:52:07] ¡Usa la versión actual de Python, leches! Ahora
Ventajas de compilar el intérprete desde código fuente para
Puedes tener tu propio intérprete de Python dentro de un
Proyectos "llave en mano". El cliente quiere algo que se
[01:56:47] Jesús Cea repite una vez más la anécdota de que
Falta toda la base, pero... ¿Hace falta?
[01:59:12] Memoria escasa en un microcontrolador.
[01:59:55] Final.
Participantes:
Jesús Cea, email: [email protected], twitter:
Eduardo Castro, email:
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
Dani, conectando desde Málaga.
Miguel Sánchez, email:
Jorge Rúa, conectando desde Vigo.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Haciendo tiempo hasta que entre más gente.
Raspberry Pi Pico:
Micropython: https://www.micropython.org/.
[06:02] Truco: Python -i: Ejecuta un script y pasa a modo
También se puede hacer desde el propio código con
Jesús Cea se queja de que usando la invocación desde código
[11:17] Regresión con ipdb: https://pypi.org/project/ipdb/.
[12:37] Nueva versión de Pyston https://www.pyston.org/.
[16:22] Ver si dos fechas son iguales con datetime
[19:52] Jesús Cea ha investigado cómo funcionan los POSTs HTTP
Buena práctica: La respuesta al POST es una redirección a un
Ventajas de usar un framework.
[24:32] ¿Optimizaciones cuando tienes grandes cantidades de
Tema muy amplio, hacen falta detalles del problema.
Se ofrecen algunas ideas:
Map/Reduce: https://en.wikipedia.org/wiki/Map_reduce.
Usar generadores u otras construcciones "lazy" siempre
[31:52] Gestión de memoria en Python.
Design of CPython’s Garbage Collector:
Hora de sacar la basura garbage collector - Pablo Galindo y
[35:17] Tipografía para programadores:
Victor Mono: https://rubjo.github.io/victor-mono/.
Fira Code: https://fonts.google.com/specimen/Fira+Code.
Fira Code Retina:
[37:17] Eduardo Castro se ha currado una lista de trucos
En estas notas solo referenciamos los puntos a los que
El documento para poder seguir los comentarios de la
hash(float('inf')) -> 314159.
[43:02] LRU Caché:
Yield:
Ojo con excepciones y filtraciones de memoria.
[48:37] Uso interesante con los "context managers":
[51:12] itertools:
[56:02] ¿Qué es ser Pythonico?
Aunque esté en la biblioteca estándar, no significa que sea
asyncore:
Mover métodos funcionales en una librería separada.
Las dos jerarquías distintas que existían en Python 2.
from __future__ import ....
La migración a Python 3 fue un intento de simplificar el
[01:08:22] Seguimos desgranando los trucos propuestos por
[01:11:12] iter() y next() admiten una parametro extra
[01:17:32] Los "slices" son objetos que se pueden crear y
Pasar un iterador a una función abre posibilidades
Slice Objects: https://docs.python.org/3/c-api/slice.html.
[01:23:42] contextlib.suppress()
[01:24:47] pathlib:
[01:25:12] Usos atípicos de else: if, for, try,
https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops.
https://docs.python.org/3/tutorial/errors.html#handling-exceptions.
Teoría unificada sobre else en Python.
[01:30:07] El orden de los except ... IMPORTA.
[01:32:22] Tu yo del futuro tiene que tratar con tu yo del
[01:33:57] Usos de lambda.
[01:35:52] Algunos trucos cortos adicionales.
collections.deque:
dateutil: https://pypi.org/project/python-dateutil/.
itertools:
if a < x < b:
Desempaquetado complejo:
Usar la variable "guión bajo" para descartar valores. Ojo
[01:56:22] Python cada vez tiene más "gotchas". Algunos
Operador morsa. Tratado con projilidad en tertulias
Parámetros mutables.
Definir "closures" dentro de un for pero usarlo fuera.
Tuplas con un solo elemento. Es más evidente el constructor
[02:01:06] ¡Terminamos con los trucos!
[02:01:37] Ideas para indexar y buscar el documentos:
Whoosh:
Solr: https://solr.apache.org/.
[02:04:22] Deberes para el futuro: módulos dis
[02:04:47] Sugerencia sobre visión artificial:
[02:06:47] regex https://pypi.org/project/regex/ que libera el
[02:07:47] Acelerador y distribución de programas Python
[02:08:57] Design of CPython’s Garbage Collector:
[02:09:17] Cierre.
[02:10:52] Casi se nos olvida el aviso legal para grabar y
[02:12:55] Final.
Participantes:
Jesús Cea, email: [email protected], twitter:
Eduardo Castro, email:
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
Dani, conectando desde Málaga, invitado por Virako.
Javier, conectando desde Sevilla, también invitado por Virako.
Antonio, conectado desde Albacete.
Jorge Rúa, conectando desde Vigo.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[01:17] Event sourcing y nieve.
[03:52] Los comentarios legales habituales para poder grabar
[04:47] Presentaciones varias, dinámica y motivación de las
[11:22] Los problemas logísticos de Jesús Cea con sus charlas.
[12:52] Debate: Frameworks y cómo condicionan el conocimiento
Mucha tela que cortar.
[30:22] Conexión con el mundo asyncio.
[34:12] Digresión: ¿Cómo funciona la protección CSRF?
Diferencia semántica entre verbos HTTP: GET y POST
Algunos recursos de seguridad web (no exhaustivo, la
CSRF:
Cross-Origin Resource Sharing (CORS)
Content Security Policy Reference
La documentación de FastAPI
CORS (Cross-Origin Resource Sharing):
OAuth2 with Password (and hashing), Bearer with
About HTTPS
[39:52] Proyecto ItsNat
Se está moviendo otra vez la inteligencia del navegador al
[44:42] ¿Realmente es imprescindible usar Javascript si tu
Brython: https://brython.info/.
Pyjs (antiguo Pyjamas):
Emscripten: https://emscripten.org/.
[48:57] ¡Compilación al vuelo!
Versionado de diccionarios. PEP 509 Add a private version to
Compilación al vuelo: Pyjion:
Conflicto con la portabilidad del intérprete.
numba: https://numba.pydata.org/.
Hay pocos "core developers" y heredar código avanzado que
LLVM: https://en.wikipedia.org/wiki/LLVM.
[01:04:27] Los lenguajes de programación deben ser conservadores
[01:05:32] Si la documentación se ha actualizado, más vale que
[01:06:47] Tema recurrente: ¿Es mejor estar dentro o fuera de la
[01:09:12] Compiladores de Python:
Cython: https://cython.org/. Rendimiento y ofuscación.
nuitka: https://nuitka.net/.
numba: https://numba.pydata.org/.
PyPy: https://www.pypy.org/.
[01:10:42] Mejoras recientes en la implementación de Python:
Issue 26647: ceval: use Wordcode, 16-bit bytecode:
Issue 9203: Use computed gotos by default:
[01:14:52] Psyco https://en.wikipedia.org/wiki/Psyco.
[01:16:22] Etiquetado de tipos para ayudar a los JIT.
Cython: https://cython.org/.
MYPY: http://mypy-lang.org/.
Especialización.
[01:22:37] GHC (The Glasgow Haskell Compiler):
[01:25:07] Memoria transaccional
Implementaciones en Python: Sistemas de persistencia como
[01:34:32] Más sobre optimizaciones y guardas.
Mucha discusión sobre el GIL:
La atomicidad de operaciones no está documentada en ningún
[01:42:02] Ejemplo de bytecode:
[01:45:02] Cuando haces cosas muy avanzadas que usan cosas no
[01:46:47] La ventaja de probar cosas en proyectos personales:
¿Por qué Jesús Cea se ha hecho su propio scraper web?
"Maldades".
scrapy: https://scrapy.org/.
[01:49:22] Migración de versiones en sistemas de persistencia.
[02:05:07] Event sourcing.
Event sourcing:
Logs de modificaciones.
[02:08:07] Ventajas de haber usado scrapy: https://scrapy.org/.
Concurrencia.
tarpit.
Problemas habituales:
Normalización de URLs.
Webs mal formadas.
[02:13:47] Módulos de scraping:
[02:15:02] Recapitulación.
Pyjion:
MYPYC: https://mypyc.readthedocs.io/en/latest/index.html.
[02:16:02] Compilación de módulos de Python para MS Windows.
[02:22:21] Final.
Participantes:
Jesús Cea, email: [email protected], twitter:
Víctor Ramírez, twitter: @virako,
Miguel Sánchez, email:
José Luis, conectando desde Madrid.
Eduardo Castro, email:
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[01:37] Reducir dependencias en los proyectos.
Las listas de Numpy https://numpy.scipy.org/ no son como
statistics: https://docs.python.org/3/library/statistics.html
Hacer scraping web sin usar Scrapy https://scrapy.org/.
[05:52] Usar librerías hace que no sepas cómo funcionan las
¿Cuánto ocupa ese objeto en memoria?
Se oculta la complejidad, se trabaja a más alto nivel.
Ineficiencia.
[09:52] La "nube" te factura toda esa ineficiencia.
Ventajas de tener servidores dedicados.
¿Y los backups?
ZFS
rsync: https://es.wikipedia.org/wiki/Rsync.
Contenedores Solaris:
Docker: https://es.wikipedia.org/wiki/Docker_(software).
Hipervisor: https://es.wikipedia.org/wiki/Hipervisor.
Ansible: https://es.wikipedia.org/wiki/Ansible_(software).
[16:22] Delegar en la magia hace que no sepas cómo funcionan las
[18:47] doctest
Una utilidad de los tests es enseñarte cómo usar un
unittest: https://docs.python.org/3/library/unittest.html.
pytest: https://docs.pytest.org/en/6.2.x/.
[22:42] ZODB https://zodb.org/en/latest/.
[23:20] Jesús Cea se plantea mantener Durus
Problemas con la licencia.
Imposible ponerse en contacto con sus autores originales.
¿Hacer un fork hostil?
[25:57] Problemas para conectar la persistencia tradicional con
[26:57] La persistencia tiene un sistema de almacenamiento
Por defecto, almacenamiento "cutre" en un fichero.
RelStorage: https://pypi.org/project/RelStorage/.
Jesús Cea: Berkeley DB Backend Storage Engine for DURUS:
Berkeley DB:
Durabilidad regulable.
Group Committing.
[29:52] Más de lo que nunca quisiste saber sobre Group Committing.
[32:52] Persistencia y Durus.
Jesús Cea: Berkeley DB Backend Storage Engine for DURUS:
[34:52] Persistencia y versionado de objetos.
Versionado objeto por objeto. Se actualiza al ir cargando
Versión de la base de datos. Migración de todos los objetos
La migración es algo que no se explica nunca lo suficiente
[47:52] La mayoría de los tutoriales son demasiado simples.
Tutorial de Python en español:
Tutoriales progresivos.
La mayoría de las charlas son "introducción a ...". No
Las mejores charlas son los postmortem.
Pegas, pero desde un punto de vista constructivo y
Es más interesante conocer los puntos débiles.
[51:57] Un motivo para no tener temáticas cerradas en las
[55:42] El tema legal habitual sobre grabar los audios de las
[57:37] Python Madrid.
Kaleidos: https://kaleidos.net/.
Meetup Python Madrid:
Nostalgia de los "buenos tiempos".
Networking entre personas.
[01:09:52] super()
[01:11:17] Operador Morsa.
PEP 572: https://www.python.org/dev/peps/pep-0572/.
Tema recurrente.
[01:13:42] La sintaxis de Python cada vez se complica más.
[01:15:57] Guido van Rossum sigue muy activo como "core
[01:16:22] Funciones lambda.
[01:21:12] Función universal que se comporta de forma diferente
What Color is Your Function?
Go: https://golang.org/.
Corrutina: https://es.wikipedia.org/wiki/Corrutina.
CSP:
La implementación actual en Python no es transparente,
[01:30:17] Stackless Python:
Documentación:
¿Por qué no se integró en CPython? Portabilidad.
[01:37:07] Licencia del logotipo de Python.
Logotipo de Python Madrid: https://www.python-madrid.es/.
Condiciones de uso del logo de Python:
[01:40:44] Repesca de temas de tertulias anteriores:
"Closures".
Respuestas "de nivel" en las listas de correo cuando la
Versionado de diccionarios.
Cacheo de "lookups" en la implementación actual de Python.
[01:46:12] Nuestra relación con PEP 8
[01:47:12] Jesús Cea y código abierto:
Mercurial de Jesús Cea: http://hg.jcea.es/.
https://blog.jcea.es.
El código publicado no es bueno. Personal. Hago lo mínimo
No hay test, por practicidad.
El código pagado no se puede enseñar.
Solo puede enseñar código el que tiene tiempo para programar
Ideas interesantes, código regulero.
[01:52:02] Equilibrio entre practicidad y perfección.
Tener claros los "puntos de dolor".
Hacer lo mínimo imprescindible.
Máquinas limitadas como la Raspberry PI:
Recibir notificaciones de cambios en el disco duro:
Entrega de valor constante e incremental.
[01:57:32] Los clientes son muy vagos y no quieren hacer los
Metodologías ágiles.
El cliente nunca tiene tiempo para probar las entregas.
[02:01:32] Compartir archivos en la tertulia, para cositas
[02:03:32] El valor de leerse la documentación de Python como si
[02:05:42] Cambio de licencia de Python 1.x a Python 2.x.
[02:06:37] Estudiar el código fuente de las propias librerías de
[02:07:02] El bug 35930 sigue coleando. Estado de la cuestión.
Issue35930: Raising an exception raised in a "future"
Temas de estilo.
[02:11:27] Despedida.
[02:13:10] Los riesgos de caerse con nieve en polvo.
[02:14:29] Final.
Participantes:
Jesús Cea, email: [email protected], twitter:
Eduardo Castro, email:
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
Juan Carlos, conectando desde Bilbao.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[01:32] Nuevas versiones: Python 3.10a4 y Numpy.
[01:57] Don’t Use Recursion In Python Any More,Python Closure —
Don’t Use Recursion In Python Any More,Python Closure — A
Hilo en la lista de correo de Python Madrid:
Closure:
Mixin: https://es.wikipedia.org/wiki/Mixin.
[10:02] ¿Qué es ser "Pythónico"?
Twisted daña el cerebro: https://twistedmatrix.com/trac/.
unittest: https://docs.python.org/3/library/unittest.html.
Black: https://pypi.org/project/black/.
from __future__ import braces.
[14:52] Python Ideas:
[16:52] ¿Comillas simples o comillas dobles? ' o ".
[23:07] Tamaño de columnas: ¿80?, ¿120?, ¿132?
[31:02] Primar la legibilidad, no el rendimiento.
Cuando tienes if ... else ..., ¿Qué caso pones primero?,
Microoptimizaciones que complican la legibilidad sin
[41:57] En las variables locales, la longitud del nombre de una
[43:02] Curiosear el "bytecode"
Dispositivo de Duff:
El "bytecode" https://es.wikipedia.org/wiki/Bytecode que
[46:22] Bytecode generado para a + a:
¡Guardas!
Sí se hacen algunas optimizaciones simples:
[50:12] Python deja su pila de evaluación vacía al terminar de
Máquina virtual de registros en vez de máquina virtual
Muchas operaciones redundantes:
¿Qué ocurre a la hora de depurar o para gestionar
[56:32] Que un hilo modifique variables de otro hilo.
¡Guardas!
NOTA DESDE EL FUTURO:
Python 3.9.5:
Traceback objects allow accessing frame objects without
[58:37] Pensábais que las interioridades del intérprete de
La complejidad debe estar en tu programa, no en el lenguaje
Compiladores optimizadores. Python se está quedando atrás.
Hacer caché al buscar atributos:
Issue1616125: Cached globals+builtins lookup optimization:
issue43452: Microoptimize PyType_Lookup for cache hits
Detectar cambios en un diccionario, incluyendo
[01:06:52] Huevos de pascua en Python:
from __future__ import braces.
import antigravity.
import this.
import __hello__.
[01:08:27] Usar pass o ... (ellipsis).
[01:09:22] El PEP 509 no es para hacer diccionarios inmutables.
Es algo interno para el API de C. No está accesible desde
Cambios pequeños pueden abrir posibilidades interesantes.
[01:13:07] Curiosidades encontradas esta semana:
traceback.clear_frames(tb):
inspect: https://docs.python.org/3/library/inspect.html.
Manipular frame.back.
Que una función sepa si se le está llamando de una forma
[01:17:02] Los problemas filosóficos que tiene Jesús Cea con
Una biblioteca debe decidir si es síncrona o asíncrona y
Hacer corrutinas "de verdad":
Persistencia y programación asíncrona.
Concepto de "awaitable":
future.result():
[01:32:17] Es difícil plantear temas tan esotéricos sin una
[01:33:32] Problemas con el control de carga de asyncio
Vuelve a tratarse el tema de si la biblioteca estándar debe
Según Jesús Cea, asyncio
Alternativas a asyncio:
Curio: https://curio.readthedocs.io/en/latest/.
Trio: https://trio.readthedocs.io/en/stable/.
La dificultad de luchar con una biblioteca que está incluída
[01:42:32] La programación asíncrona es útil para muchas más
[01:44:12] Mejor usar concurrent.futures
Transportar excepciones entre hilos.
Control de carga y paralelismo.
[01:45:42] Referencia al bug solucionado en la tertulia
Queda por ultimar el detalle de cómo solucionar el problema
Jesús Cea describe las dos opciones que está barajando:
[01:50:57] Ya hubo "flames" brutales con Guido cuando se
[01:55:02] Despedida.
[01:55:50] Final.
Participantes:
Jesús Cea, email: [email protected], twitter:
Víctor Ramírez, twitter: @virako,
Miguel Sánchez, email:
Juan Carlos.
Plutarco, conectando desde Madrid.
Eduardo Castro, email:
Julio, conectando desde Chile.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Presentaciones.
[03:24] Aviso legal de que se está grabando y objetivos de la
[06:22] Autoimport, ¿debería ser una funcionalidad del IDE?
[12:52] Los IDEs y las inercias.
PyCharm: https://www.jetbrains.com/pycharm/.
Atajos de teclado.
vim: https://es.wikipedia.org/wiki/Vim.
Uso del teclado en vez del ratón.
Emacs: https://es.wikipedia.org/wiki/Emacs.
[19:22] Operador morsa (walrus). Sigue usándose muy poco.
Python va complicando la sintaxis más y más.
Se habló en una tertulia anterior.
Jesús solo ha encontrado este caso útil:
Pasar de:
A lo siguiente:
[25:57] Erratas en tertulias anteriores:
Migración de Python a Github fue en 2017.
No es "Steering committee" sino "Steering Council".
[27:02] Pablo Galindo forma parte del "council" tras las
Charla de Pablo Galindo en la PyconES 2019 sobre el mundo
Algunos proyectos Python están usando Rust. Por ejemplo:
Las variables locales pueden ser modificadas a través de su
Esto es lo que hace, por ejemplo, un debugger.
[35:37] ¡Spoiler sobre la resolución del "Memory Leak"!
Issue35930: Raising an exception raised in a "future"
Traceback:
Frame:
Stack:
[39:17] Usar una técnica similar para detectar las
[41:32] Sigo explicando detalles de la solución del "Memory
Issue35930: Raising an exception raised in a "future"
Estamos continuando una conversación que ha durado varias
Jesús Cea pone un ejemplo de cómo generar un ciclo con una
La caja y media de cervezas se las lleva... ¡Jesús!
[47:22] No se está conectando gente desde Hispanoamérica. ¿Por
[50:07] Más erratas: Los "tracebacks" NO son inmutables.
[50:32] Nuevo método "with_traceback()" a la hora de crear
https://docs.python.org/3/library/exceptions.html#BaseException.with_traceback.
Puedes generar una excepción con un "traceback"
El caballo de batalla del bug es que el "future"
Explicando cómo se visualizan los "traceback" si un "future"
Cuando un "future"
Hay varias formas de solucionar el bug. Ahora hay que pensar
[01:01:52] Sobre el "nivel" de las tertulias y sus motivaciones.
[01:06:12] Referencia rápida a temas de la tertulia anterior:
Dataclasses:
Pydantic: https://pypi.org/project/pydantic/.
FastAPI: https://pypi.org/project/fastapi/.
[01:09:17] Diagnóstico exhaustivo del bug "Memory Leak", causa
Issue35930: Raising an exception raised in a "future"
Exploración del propio código fuente de Python.
Repaso detallado del funcionamiento de un "future"
Uno de los problemas fundamentales de trabajar con hilos es
Este "transporte" es lo que está ocasionando el "Memory
¡Agárrate que vienen curvas!
[01:21:32] Ojo a la línea self = None. Aquí se rompe el
Closures:
"Pool" de "workers". De forma estándar, Python te
[01:31:32] Las partes relevantes en el hilo principal son:
https://github.com/python/cpython/blob/3.9/Lib/concurrent/futures/_base.py#L413.
https://github.com/python/cpython/blob/2fe408497e6838b6fb761e42e8f8ffc70bd6f3b1/Lib/concurrent/futures/_base.py#L387.
[01:37:02] ¡Brainstorming!
[01:42:42] try ... finally
Jejeje, alguien propone algo que funcionaría :-).
[01:43:57] Weakref:
Se pueden "resucitar" objetos.
[01:51:02] Volvemos al hilo, la corrección del bug.
El gráfico de antes, con ciclos:
El gráfico de después, sin ciclos:
[01:55:12] Comprobar este bug con un test unitario.
Por sus características... complicado.
"sys.getrefcount()":
"sys.exc_info()": https://docs.python.org/3/library/sys.html#sys.exc_info.
"Race conditions":
[01:59:22] Cuando recoge basura de objetos, podemos pedir que
"gc.DEBUG_SAVEALL":
Se puede limpiar "gc.garbage" antes de la ejecución del
[02:03:42] Bola extra:
Editar los audios.
Machine learning para el procesado de audio.
El problema del cocktail:
RNNoise https://jmvalin.ca/demo/rnnoise/.
[02:09:52] Repaso del día para los que llegaron tarde.
[02:12:52] Weakref:
Jesús ofrece algunos ejemplos de su utilidad.
[02:19:22] Iteradores WSGI
[02:21:12] Weakref en caché de objetos Durus
[02:23:52] El valor de la tertulia es llevarse algo que probar
[02:25:22] La tertulia la hacen los asistentes.
[02:28:36] Final.
En lo que sigue, cuando se habla de CPython, se refiere al
Participantes:
Eduardo Castro, email:
Jesús Cea, email: [email protected], twitter:
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
Juan Carlos.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Seguimos hablando del bug comentado la semana pasada.
[02:17] El "bytecode" https://es.wikipedia.org/wiki/Bytecode
[08:32] Recogida de basuras.
gc.set_threshold():
gc.disable():
[11:27] Herramientas de monitorización:
[13:32] Funcionalidades de auditoría de Python:
PEP 551 -- Security transparency in the Python runtime
PEP 578 -- Python Runtime Audit Hooks
[16:47] Más herramientas de monitorización:
SystemTap: https://es.wikipedia.org/wiki/SystemTap.
eBPF: https://ebpf.io/.
py-spy: https://github.com/benfred/py-spy.
[17:52] Más sobre DTrace
[22:12] Tracemalloc.
[23:02] Seguimos hablando del bug comentado la semana pasada.
bug bpo35930: "Raising an exception raised in a "future"
¡Se ofrece una caja de cervezas!
Brainstorming.
Diagnóstico detallado.
weakref — Weak references:
Se sube la apuesta a caja y media de cervezas :-).
La excepción salta en un hilo y se "transporta" y almacena
Test reproducible.
[36:42] Aviso legal.
[38:27] Las futuras notas de las grabaciones serán EXHAUSTIVAS
[39:17] Ideas para "cebar" las tertulias.
[40:37] Cómo organizar las tertulias, diferentes intereses y
[42:32] ¿Cómo se organizan los "core developers"?
El desarrollo se ha movido en github. Los bugs están a medio
https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html
PEP 581 -- Using GitHub Issues for CPython
Guía del desarrollador: https://devguide.python.org/.
Backporting de bugs de cpython de la versión en desarrollo a
¿Cómo se obtiene y se pierde el status de "core developer"?
Steering council. PEP 8016:
Desde que Guido no es BDFL, está muy activo en listas de
[52:22] ¡Víctor quiere más bugs para aprender!
[53:42] ¿Qué partes de CPython están escritas en C y cuáles en
Se escribe en C lo que no tiene más remedio, por rendimiento
Más adelante de la conversación Jesús Cea explica cómo ver
[57:32] PyPy https://www.pypy.org/. Intérprete de Python
[58:27] ¿Incluir otros lenguajes en la implementación de
Rust:
PyOxidizer: https://github.com/indygreg/PyOxidizer.
Fragmentación. Jesús Cea estoy más centrado en la parte de C
Portabilidad de C.
Bootstraping de un lenguaje con el propio lenguaje.
[01:05:02] Python 3.9. Mejoras.
[01:08:07] Dataclasses:
La dificultad para tener atributos opcionales. Algunas
attrs: https://www.attrs.org/en/stable/.
Usar valores "sentinel".
DRY: https://es.wikipedia.org/wiki/No_te_repitas.
[01:20:52] Pydantic: https://pydantic-docs.helpmanual.io/.
[01:23:07] Horarios de las tertulias. Mucha discusión y algunas
[01:30:27] Jesús Cea explica cómo ver si un módulo concreto está
[01:31:18] Más sobre la dinámica de las tertulias.
Debate sobre presentarse o no en tertulias abiertas, o tener
Va siendo necesario tener algun repositorio para que la
[01:36:42] Actas de las tertulias y publicar las grabaciones de
[01:39:08] El "nivel" de las listas de correo. ¿Dónde están las
La maldición de lo básico e "introducción a". Igual para que
Python-Madrid antes de que llegase Meetup.
Jesús Cea sugiere listas como "python-ideas":
Javier tiene intereses muy extraños :-).
[01:54:52] Cierre.
[01:56:42] Final.
En lo que sigue, cuando se habla de CPython, se refiere al
Participantes:
Eduardo Castro, email:
Jesús Cea, email: [email protected], twitter:
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako,
Miguel Sánchez, email:
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Aviso de que se está grabando. Temas legales.
[01:52] Valor de publicar estos audios y las dificultades para
[02:42] Métodos mágicos:
[04:12] Problemas con PIP 20.3.2:
[05:52] ¿Actualizar a la última versión o esperar?
Poder "echar atrás" fácil.
Acumular cambios pendientes es deuda técnica.
[10:42] Google caído
[11:02] Generación de wheels en varios sistemas:
auditwheel: https://pypi.org/project/auditwheel/.
¿Generación de Wheels en Microsoft Windows?
[13:12] Caché local de PIP https://pip.pypa.io/en/stable/.
[14:17] Event Sourcing
[14:42] De momento se puede usar el viejo "resolver" de
Se puede usar la opción -use-deprecated=legacy-resolver.
Esa opción se puede meter también en el fichero de
Jesús Cea comete el pecado de meter paquetes Python en el
[17:02] Batallitas de Jesús Cea.
Jesús lleva dos años dándole vueltas a esto: bpo35930:
Explicación detallada del asunto.
Brainstorming.
[21:22] Visión a alto nivel del recolector de basuras de
Contador de referencias. Inmediato, pero no recoge
Si se crean instancias y no se destruyen, se llama a un
Esto puede ser problemático al arrancar el programa,
gc.disable():
Jesús Cea "abusa" de los destructores y de que se
Jesús ofrece cervezas.
gc.collect():
Futures:
[35:29] Módulo Manhole https://pypi.org/project/manhole/.
Explorar un programa en producción.
Tracemalloc:
DTrace: http://dtrace.org/blogs/about/.
py-spy: https://pypi.org/project/py-spy/.
Pérdidas de memoria: Recordar lo hablado ya en tertulias
jemalloc: http://jemalloc.net/.
MALLOC_PERTURB_:
zswap: https://en.wikipedia.org/wiki/Zswap.
[42:52] Micropython: https://micropython.org/.
ESP8266: https://en.wikipedia.org/wiki/ESP8266.
ESP32: https://en.wikipedia.org/wiki/ESP32.
Bluetooth Low Energy:
¿Qué ventajas aporta usar Micropython?
[52:42] ¿El futuro será mejor? O no.
Desperdicio de recursos materiales porque realmente sobran.
Python es mucho más lento que C y no digamos ensamblador.
[57:17] Cambiar Python por un lenguaje más rápido.
Go:
Rust:
C++: https://en.wikipedia.org/wiki/C%2B%2B.
[01:00:20] Python no pinta nada en móviles.
[01:02:07] Acelerar Python.
Subinterpreters: PEP 554:
Si los subintérpretes no compartiesen NADA, se podrían
JIT:
PYPY: https://www.pypy.org/.
Numba: https://numba.pydata.org/.
Cython: https://cython.org/.
Python es "potencialmente" muy dinámico, pero en la práctica
Conversación densa entre Jesús y Javier.
Guardas para comprobar que la especialización sigue
"Tipado" más estricto.
MYPY: http://mypy-lang.org/.
Pydantic:
Comprobación de tipos en tiempo de ejecución.
Descubrimiento de tipos en tiempo de ejecución,
Eduardo Castro entra y simplifica la discusión.
Jesús explica qué hace "a+b" internamente.
[01:29:22] PyParallel http://pyparallel.org/
Memoria transaccional:
(nota de Jesús Cea): Los sistemas de persistencia Python
"Colorear" objetos y que dos hilos no puedan acceder a
[01:30:42] PYPY https://www.pypy.org/ es tan sofisticado que
Jesús Cea lo ha intentado y se ha rendido.
psyco: https://en.wikipedia.org/wiki/Psyco.
CFFI: https://cffi.readthedocs.io/en/latest/.
[01:35:22] Compilar CPython a WebAssembly
[01:36:02] Simplemente compilar código python con Cython
[01:36:57] Subinterpreters: PEP 554:
Poder usar todos los núcleos de la CPU.
[01:38:07] Seguimos hablando del asunto.
[01:39:07] Un problema es que Python tiene la vocación de
[01:40:17] Cierre.
Dadle una pesada al bug bpo35930: "Raising an exception raised
[01:41:13] Final.
En esta ocasión grabamos un miércoles porque ayer fue festivo en
Participantes:
Eduardo Castro, email:
Jesús Cea, email: [email protected], twitter:
Miguel Sánchez, email:
Víctor Ramírez, twitter: @virako,
Artur, conectando desde Vigo.
Audio editado por Pablo Gómez, twitter:
La música de la entrada y la salida es "Lightning Bugs", de Jason
[00:52] Problemas de sonido.
[01:57] "Duda/problema con mod_wsgi-express"
Referencia a un
Los módulos se importan una sola vez.
mod_wsgi: https://pypi.org/project/mod-wsgi/.
matplotlib: https://matplotlib.org/.
Damos con la solución: Ojo con los objetos globales y
[07:52] Python 3.9.1.
PEP 384: https://www.python.org/dev/peps/pep-0384/.
Py_FileSystemDefaultEncodeErrors and Py_UTF8Mode are not
[09:07] Estado de persistencia en Python.
ZODB: http://www.zodb.org/en/latest/.
Durus: https://www.mems-exchange.org/software/DurusWorks/.
[10:07] ¿Cómo conectar la tecnología de persistencia con el
[11:47] Según la opinión de Jesús Cea, la implementación actual
La idea es buena, pero la implementación es chapucera y poco
Es muy difícil combinar los mundos síncronos y asíncronos.
El código asíncrono "contamina" todo el programa.
[15:52] Moderación en la lista de correo.
[18:47] Reconducimos la tertulia. ¿Estáis usando Python 3.9?
Las distribuciones no están a la última. Cada cliente tiene
Utilizar cosas como Docker
Los tests te salvan el día a la hora de actualizar de
[25:22] Sistemas de tests avanzados.
Hypothesis: https://pypi.org/project/hypothesis/.
Prueba de mutación:
[27:37] Podcasts en inglés que escucha Jesús:
Python Bytes https://pythonbytes.fm/.
Seis temas, media hora. Semanal.
Opinión con criterio.
Podcast de testing: Test & Code https://testandcode.com/.
[30:52] Justificar actualizar a versiones modernas de Python.
No suele haber problemas de compatibilidad actualizando a
Problema: Los paquetes precompilados de librerías complejas
Muchas librerías complejas no publican versiones
Si tardas en actualizar, actualizar múltiples versiones de
[34:32] El nuevo "resolver" de dependencias de PIP
Se puede usar la opción -use-deprecated=legacy-resolver.
Librerías compatibles con versiones nuevas de Python, pero
[38:24] ¿Desde dónde conectamos cada uno?
Spam de Jesús en las listas de correo.
¿Qué pasa con la gente de hispanoamérica?
Mucha gente conectando desde Vigo y alrededores.
Comunidades técnicas en el entorno de Vigo.
Vigo Tech Alliance https://vigotech.org/.
A Industriosa https://aindustriosa.org/.
[43:42] Aviso de que las tertulias se graban.
[44:42] Las ideas de Jesús Cea sobre las tertulias.
[46:37] Bases de datos.
SQLAlchemy https://www.sqlalchemy.org/.
Modelos de datos.
Diversas bases de datos.
PostgreSQL: https://www.postgresql.org/.
MySQL: https://www.mysql.com/.
MongoDB: https://www.mongodb.com/.
Jesús Cea usa sistemas de persistencia. Se ha hablado mucho
[51:42] Persistencia en Python.
Tema abordado de forma extensa en la tertulia anterior:
[01:02:52] La persistencia no usa teoría relacional.
Trabajando con persistencia, no puedes traerte tus ideas de
Acceso al sistema de persistencia a través de un API.
[01:09:27] Nuevas incorporaciones a la tertulia.
[01:10:12] ¿ORM de Django https://www.djangoproject.com/ o
[01:14:32] Jesús insiste en sus sistemas de persistencia.
ZODB: http://www.zodb.org/en/latest/.
¿Cómo se actualiza la definición de objetos? Jesús describe
Versión global de la base de datos con actualización en
Cada objeto tiene su versión y se actualiza al cargarlo
Los objetos son objetos nativos de Python. Para que otros
[01:26:32] Tecnología "publicar & suscribir"
Event Sourcing
Lenguaje Linda
RabbitMQ: https://www.rabbitmq.com/.
ZeroMQ: https://zeromq.org/.
Redis: https://redis.io/.
Pyro: https://pyro5.readthedocs.io/en/latest/.
Colas persistentes.
BerkeleyDB: https://en.wikipedia.org/wiki/BerkeleyDB.
[01:40:37] Open Source y mantenedores quemados.
Github: https://github.com/.
[01:49:54] Final.
From the publisher's feed

1,118 Listeners