Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Felipem, conectando desde Cantabria.
Juan José, Nekmo, https://nekmo.com/, https://github.com/Nekmo/. Madrileño conectando desde Málaga.
Jesús, conectando desde Ferrol.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Plataformas de podcasting.
No necesitas ninguna plataforma, puedes usar directamente el feed RSS https://es.wikipedia.org/wiki/Rss.
Funkwhale https://funkwhale.audio/.
toc2audio https://docs.jcea.es/toc2audio/.
Jesús Cea tiene su propia plataforma de podcasting, herramientas, etc. Quiere evitar la centralización a toda costa.
En Mercurial https://es.wikipedia.org/wiki/Mercurial es imposible modificar la historia.
Es imposible hacer nada sofisticado en Git https://es.wikipedia.org/wiki/Git sin recurrir a Google.
Mercurial - Filosofía y visión de alto nivel: https://www.jcea.es/artic/mercurial_madrid/.
Bitbucket https://bitbucket.org/ ya no soporta Mercurial.
Hay alternativas pequeñitas. Por ejemplo, Heptapod https://heptapod.net/.
¡Evita la centralización!
Al final, el 99.9% de los proyectos de código abierto los mantienen los autores originales en exclusiva.
Microsoft to acquire GitHub for $7.5 billion https://news.microsoft.com/2018/06/04/microsoft-to-acquire-github-for-7-5-billion/.
¿Trabajar por visibilidad? Eso se cura con la edad.
Mantener infraestructura propia tiene su coste, pero puedes pagar a alguien para que lo haga, promoviendo multitud de plataformas federadas en vez de centralizar internet más y más.
En cada campo de internet, hay uno o dos ganadores y nadie más pinta nada. Jesús Cea se queja mucho de eso.
Diferencia entre aprendizaje automático "de toda la vida" y el aprendizaje con refuerzo https://es.wikipedia.org/wiki/Aprendizaje_por_refuerzo.
Redes neuronales: TensorFlow https://es.wikipedia.org/wiki/TensorFlow y Keras https://es.wikipedia.org/wiki/Keras.
Procesado de texto: NLTK https://es.wikipedia.org/wiki/NLTK.
scikit-learn https://scikit-learn.org/stable/index.html.
Algunos libros:
Python Machine Learning - Second Edition: Machine Learning and Deep Learning with Python, scikit-learn, and TensorFlow https://www.amazon.es/Python-Machine-Learning-Sebastian-Raschka/dp/1787125939/. Hay versión en castellano.
"TensorFlow en un dia" https://www.amazon.es/TensorFlow-Day-Neural-Network-English-ebook/dp/B07H474R7Q/. Hay versión en castellano.
Packt publica un libro gratis al día, muchos de aprendizaje automático: https://www.packtpub.com/free-learning.
"Towards Data Science" https://towardsdatascience.com/.
Vídeos:
Dot CSV: https://www.youtube.com/channel/UCy5znSnfMsDwaLlROnZ7Qbg.
Slack https://slack.com/. ¡Arggg, otra plataforma privada centralizada!:
PEP 563 -- Postponed Evaluation of Annotations https://www.python.org/dev/peps/pep-0563/.
Aún quedan meses para que se publique Python 3.10, se puede dar marcha atrás.
>>> def pepe():
... print('hola')
...
>>> def perico(x:pepe()):
... pass
...
hola
¡Son charlas de bar! Conversaciones informales, sin investigación detallada.
¿Publicar audios de fé de erratas?
True/False:
>>> int(True)
1
>>> int(False)
0
>>> bool(0)
False
>>> bool(1)
True
>>> def a(pepe=5, **kwargs):
... print(pepe, kwargs)
...
>>> a(5, siete=5)
5 {'siete': 5}
Se explican algunos casos de uso.
toc2audio https://docs.jcea.es/toc2audio/.
PEP 557 -- Data Classes https://www.python.org/dev/peps/pep-0557/.
Decoradores de clases: PEP 3129 -- Class Decorators https://www.python.org/dev/peps/pep-3129/.
pydantic https://pypi.org/project/pydantic/. Validación de tipos en tiempo de ejecución. Esta biblioteca se nombra en casi todas las tertulias.
Mypy http://mypy-lang.org/. Validación de tipos en tiempo de "testing" o integración continua.
Libro: Python avanzado en un fin de semana https://www.amazon.es/Python-avanzado-fin-semana-Aprende-ebook/dp/B08XLYC38D.
Libro de iniciación: Aprende Python en un fin de semana https://www.amazon.es/Aprende-Python-en-fin-semana-ebook/dp/B07GXDXLYC/.
Aunque solo se pueda ejecutar un hilo simultaneamente, es ventajoso cuando hay hilos dominados por la entrada/salida.
Multihilo https://es.wikipedia.org/wiki/Hilo_(inform%C3%A1tica).
Ha habido muchos intentos de cargarse el GIL de Python, con poco éxito.
Ejemplos de beneficios de multihilo y de tener varias CPUs https://es.wikipedia.org/wiki/Unidad_central_de_procesamiento en Python, aún con el GIL actual.
Charla de Jesús Cea en la PyConES 2018: GIL: Todo lo que quisiste saber y no te atreviste a preguntar https://www.youtube.com/watch?v=50eOwz9lek4.
Vim https://es.wikipedia.org/wiki/Vim.
Sublime Text https://www.sublimetext.com/.
PyCharm https://www.jetbrains.com/pycharm/.
Eclipse https://www.eclipse.org/ide/.
Automatizar cosas implica que puedes perder la capacidad de hacerlo "a mano", cuando lo necesites.
Se emplaza un futuro debate sobre IDEs https://es.wikipedia.org/wiki/Entorno_de_desarrollo_integrado.
Inercia para cambiar. El coste de cambiar el evidente, y lo que puede no ser evidente es el beneficio de cambiar.
"Intentar salir de vim". Fuente inagotable de memes https://es.wikipedia.org/wiki/Meme.
Módulo Mercurial que interactúa con GIT: hg-git https://pypi.org/project/hg-git/.
WebDAV: https://es.wikipedia.org/wiki/WebDAV.
Wing Python IDE: https://wingware.com/.
El tiempo se va en pensar, no en picar código.
También importa el perfil de código o proyecto concreto. Por ejemplo, puede haber mucha plantilla fácil de automatizar.
Apuntarnos temas para traer a lo largo de la semana.
Canal de Telegram https://t.me/joinchat/y__YXXQM6bg1MTQ0.
Jesús Cea explica cómo graba. Algo bizarro y que funciona casi de casualidad.
Cuando Jesús Cea grababa podcasts https://es.wikipedia.org/wiki/P%C3%B3dcast con un grupo cerrado de gente, la grabación era local cada uno en su máquina. Cada uno grababa su micrófono local y la suma de todos los demás en dos canales distintos. Eso permite tener separación de canales para editar el sonido y, si alguien se olvida de ponerlo, su voz ha quedado grabada en remoto en todos los demás.
ALSA https://en.wikipedia.org/wiki/Advanced_Linux_Sound_Architecture.
PulseAudio https://es.wikipedia.org/wiki/PulseAudio.
PipeWire https://en.wikipedia.org/wiki/PipeWire.
Jesús Cea explica por qué no está usando esa tecnología en las tertulias.
Jibri: Jitsi BRoadcast Infraestructure https://github.com/jitsi/jibri.
aiortc https://pypi.org/project/aiortc/.
Hay un montón de plataformas de grabación online, de pago. El problema habitual es el soporte de conexiones desde distintos dispositivos.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Jesús, conectando desde Ferrol.
Felipem, conectando desde Cantabria.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Sergio, conectando desde Vigo.
Juan José, Nekmo, https://nekmo.com/, https://github.com/Nekmo/. Madrileño conectando desde Málaga.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Las Palmas.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Cada paquete instalado está vinculado a una instancia concreta de Python instalada en el sistema.
Nunca hacer pip install, sino indicar la versión: pip3.9
install.
A la hora de instalar paquetes Python en la versión nativa
del sistema operativo, se puede usar pip o bien el gestor
de paquetes del sistema operativo. Mezclar ambas es una
receta para el desastre.
Jit: Compilación al vuelo https://es.wikipedia.org/wiki/Compilaci%C3%B3n_en_tiempo_de_ejecuci%C3%B3n.
Barrera de entrada muy grande para entrar en el proyecto. Curva de aprendizaje.
Problemas con los módulos en C. No valoraron la importancia del ecosistema.
Jesús Cea lo está utilizando para publicar su biblioteca toc2audio https://docs.jcea.es/toc2audio/.
Herramienta propuesta en la charla "Python Packaging: Lo estás haciendo mal" https://www.youtube.com/watch?v=OeOtIEDFr4Y, de Juan Luis Cano.
PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.
Lo importante que es tener enlaces directos al "changelog" o a la documentación en PyPI https://pypi.org/.
Docstrings.
Sphinx https://pypi.org/project/Sphinx/.
make html.Tema eterno: Incluir una biblioteca en la biblioteca estándar o como biblioteca estándar.
ReST: reStructuredText https://docutils.sourceforge.io/rst.html.
docutils: https://pypi.org/project/docutils/.
Jesús Cea ha estado intentando conectar con los autores, con poco éxito.
Jesús Cea tiene problemas con la licencia.
¿Abandonar el proyecto y pasarse a ZODB https://zodb.org/en/latest/?
La gente está haciendo "forks" https://en.wikipedia.org/wiki/Fork_(software_development) pasando olímpicamente de las licencias.
Jesús Cea se está currando varios cambios de licencia en ciertos proyectos que le interesan, con muy poco éxito.
COPYRIGHT ASSIGNMENT https://www.copylaw.com/forms/copyassn.html.
Modelo completamente diferente a un ORM https://en.wikipedia.org/wiki/Object%E2%80%93relational_mapping.
Working set: https://en.wikipedia.org/wiki/Working_set.
Creamos un fichero "a.py" con el contenido:
def x():
print('X')
Creamos otro fichero "b.py" con el contenido:
import a
class clase:
x = a.x
def p(self):
print(self.x)
self.x()
if __name__ == '__main__':
a.x()
b = clase()
b.p()
Ejecutas "b.py" y me explicas por qué sale lo que sale :-).
Pista: los métodos son descriptores: https://docs.python.org/3/howto/descriptor.html.
Bound method: https://www.geeksforgeeks.org/bound-methods-python/.
Métodos estáticos: https://pythonbasics.org/static-method/.
No se ha entendido nada porque ha habido numerosos cortes de sonido. El tema está bastante mejor explicado y se entiende en, por ejemplo, From Function to Method https://wiki.python.org/moin/FromFunctionToMethod.
class clase:
def p(self):
clase.p.hola = 78
>>> x=clase()
>>> x.p()
>>> x.p.hola
78
>>> y=clase()
>>> a.p.hola
78
>>> clase.p.hola
78
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Javier, conectando desde Madrid.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Auriculares para evitar pedir demasiado al sistema de cancelación de eco, sobre todo si la sala tiene reverberación.
¡Manos fuera del teclado!
toc2audio https://docs.jcea.es/toc2audio/ usa Flit https://pypi.org/project/flit/.
Erratas de lo que se dijo la tertulia pasada sobre Flit https://pypi.org/project/flit/.
"from X import Y as Z".
Cuidado con las microoptimizaciones.
Reducir no es optimizar, necesariamente.
Comentarios obvios sin utilidad.
Los comentarios deben explicar el contexto, no lo que puedes ver directamente en el código.
Ejemplos de comentarios inútiles.
Metacomentarios:
Nuevas versiones (fallidas) de Python 3.8 y 3.9.
Última alpha de Python 3.10.
Caída de PyPI https://pypi.org/: PyPI Unavailable : https://status.python.org/incidents/rw171ylf8jw3.
What does this print, #1: https://blog.kevmod.com/2014/06/what-does-this-print-1/.
Depende de la implementación.
Da pistas de cómo funciona la implementación Python por dentro.
Hay muchas ambigüedades en las implementaciones de Python. Hay muchas reglas implícitas no documentadas.
Condiciones de carrera: https://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera.
Conflictos entre múltiples instancias o múltiples hilos.
Patrón de diseño "singleton" https://es.wikipedia.org/wiki/Singleton.
¿Qué es una variable global?
"Contextvars": https://docs.python.org/3/library/contextvars.html.
"Closures": https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
¿Los tests unitarios están sobrevalorados?
¿Concentrarse en tests funcionales?
Mock: unittest.mock https://docs.python.org/3/library/unittest.mock.html.
Tests unitarios cuando se solucionan bugs, para evitar regresiones.
Al refactorizar https://es.wikipedia.org/wiki/Refactorizar el código, hay que refractorizar tanto el código como los tests unitarios.
Inyección de dependencias https://es.wikipedia.org/wiki/Inyecci%C3%B3n_de_dependencias.
Jesús Cea se ha pasado la tertulia sujetando el micro con la mano y Eduardo no ha metido ruido de teclado.
Jesús Cea tiene "ideas" de cómo grabar mejor. ¡Peligro!
Plataformas de grabación online.
El problema del cocktail: https://en.wikipedia.org/wiki/Signal_separation?wprov=srpw1_4#Cocktail_party_problem.
Supresión de ruido: rnnoise https://jmvalin.ca/demo/rnnoise/.
Cancelación de ruido espectacular de NVIDIA: https://www.youtube.com/watch?v=d0g1EviDyWM.
Pablo Gómez utiliza Ardour https://ardour.org/ para editar los audios.
A Jesús Cea no le gusta nada utilizar mensajería instantanea para cosas que se quieran conservar.
Este audio tiene mucho ruido producido por el roce del micrófono de Jesús Cea en la ropa.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Felipem, conectando desde Cantabria.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Javier, conectando desde Madrid.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Hay que automatizarlo todo, y lo que no se puede automatizar, se documenta.
Detalles de calidad de grabación.
Lo que falta para publicar los audios.
La publicación de audios es inminente.
Diversas plataformas de podcast https://es.wikipedia.org/wiki/Podcasting.
¿Y publicar en Youtube?
Estadísticas de descarga.
¡Muerte al MP3! https://es.wikipedia.org/wiki/MP3
La charla ha gustado bastante en general.
Mucha documentación online está anticuada. Viene bien una lista de "buenas prácticas" actualizadas.
El peso del "legado" anticuado.
El ecosistema se está moviendo muy rápido.
Buenas prácticas: https://packaging.python.org/. Esperemos que alguien mantenga eso actualizado.
PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.
Pecado que Jesús Cea comete constantemente: ¡instalar paquetes a nivel de sistema operativo!. No le da problemas porque hace tantas barbaridades que se cancelan unas a otras. ¡Tú mejor que sigas las recomendaciones de Juan Luis Cano https://twitter.com/juanluisback!
pipenv es el mal https://pypi.org/project/pipenv/.
pip-tools https://pypi.org/project/pip-tools/.
pipdeptree https://pypi.org/project/pipdeptree/.
¡Tests de integración! https://es.wikipedia.org/wiki/Prueba_de_integraci%C3%B3n
hypothesis https://pypi.org/project/hypothesis/.
mutant https://pypi.org/project/mutant/.
PEP 420 -- Implicit Namespace Packages https://www.python.org/dev/peps/pep-0420/.
PEP 621 -- Storing project metadata in pyproject.toml https://www.python.org/dev/peps/pep-0621/.
Conda: https://docs.conda.io/en/latest/.
Problemas para que los Wheel soporten las nuevas versiones de Python.
Cuando sale una nueva versión de Python, suele ser necesario esperar para tener soporte Wheels de los paquetes que nos interesan.
ELF (Executable and Linkable Format): https://en.wikipedia.org/wiki/Executable_and_Linkable_Format.
Si puedes instalar Python desde código fuente, seguro que puedes compilar mi librería desde código fuente también.
Ojo con los paquetes binarios avanzados en CPUs antiguas.
API alternativa para módulos Python en C. https://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones.
Permite generar un Wheel https://www.python.org/dev/peps/pep-0427/ que funciona en varias versiones de Python.
Buen rendimiento tanto en CPython como en PyPy https://www.pypy.org/.
Posible API https://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones futuro para CPython.
La publicación de los audios es inminente.
Reusaremos el podcast "Python en español" https://podcast.jcea.es/python/. He pedido permiso a mis antiguos compañeros.
CSS: https://es.wikipedia.org/wiki/Hoja_de_estilos_en_cascada.
Hay tanto retraso en la publicación que cualquier "feedback" tardará en salir y en notarse sus efectos.
Usarlo para depurar un bug.
Pena de muerte en producción.
Ideas locas: James Powell https://twitter.com/dontusethiscode.
Conocimiento íntimo del lenguaje y de su implementación.
Security funding & NYU https://discuss.python.org/t/new-packaging-security-funding-nyu/7792.
TUF (The Update Framework) https://theupdateframework.io/.
PEP 458 -- Secure PyPI downloads with signed repository metadata https://www.python.org/dev/peps/pep-0458/.
PEP 480 -- Surviving a Compromise of PyPI: End-to-end signing of packages https://www.python.org/dev/peps/pep-0480/.
En honor a Eduardo, que no se ha conectado hoy, metemos ruido de teclado para que nuestro editor Pablo no lo eche de menos.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Felipem, conectando desde Cantabria.
Jesús, conectando desde Ferrol.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
for: PEP 3132 -- Extended Iterable
Unpacking: https://www.python.org/dev/peps/pep-3132/.
Busca en Internet: "Python tuple unpacking".
PEP 448 -- Additional Unpacking Generalizations: https://www.python.org/dev/peps/pep-0448/.
PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.
PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.
PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.
PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.
Tema recurrente: ¿Compensa complicar la sintaxis del lenguaje?
Guido van Rossum https://es.wikipedia.org/wiki/Guido_van_Rossum está apoyando muchos cambios polémicos en Python.
El principio del fin fue la implementación de
async/await y dividir Python en dos mundos: síncrono y
asíncrono.
Biblioteca asyncio:
https://docs.python.org/3/library/asyncio.html.
Biblioteca unsync: https://pypi.org/project/unsync/.
inspect.iscoroutinefunction(object):
https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction.
inspect.iscoroutine(object):
https://docs.python.org/3/library/inspect.html#inspect.iscoroutine.
inspect.isawaitable(object):
https://docs.python.org/3/library/inspect.html#inspect.isawaitable.
inspect.isasyncgenfunction(object):
https://docs.python.org/3/library/inspect.html#inspect.isasyncgenfunction.
inspect.isasyncgen(object):
https://docs.python.org/3/library/inspect.html.
Sans IO: https://sans-io.readthedocs.io/.
Máquina de estados: https://es.wikipedia.org/wiki/M%C3%A1quina_de_estados.
PEP 458 -- Secure PyPI downloads with signed repository metadata https://www.python.org/dev/peps/pep-0458/.
Permite meter espejos de PyPI https://pypi.org/ sin tener que confiar en ellos.
Aquí no vamos a describir cada respuesta de la encuesta en las notas de la tertulia, pero listamos puntos y enlaces que pueden ser de interés.
WebAssembly: https://es.wikipedia.org/wiki/WebAssembly.
asm.js: https://en.wikipedia.org/wiki/Asm.js.
Emscripten: https://emscripten.org/.
Javascript en javascript: Polyfill https://en.wikipedia.org/wiki/Polyfill_(programming).
Reportlab https://pypi.org/project/reportlab/.
PyPDF3 https://pypi.org/project/PyPDF3/.
weasyprint https://pypi.org/project/weasyprint/.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Jesús, conectando desde Ferrol.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Gato, desde Chile.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Comunidades locales en Galicia.
Python Vigo: https://www.python-vigo.es/.
Makerspaces: https://en.wikipedia.org/wiki/Hackerspace.
GPUL: Grupo de Programadores e Usuarios de Linux: https://www.gpul.org/.
Ventaja de la sintaxis actual: al aparecer el término "lambda", se puede buscar en Internet.
El lenguaje cada vez es más opaco y complejo.
PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.
El parser nuevo abre muchas posibilidades peligrosas.
Lista de correo de Python-ideas: https://mail.python.org/mailman3/lists/python-ideas.python.org/.
Librerías para procesar y generar bytecode https://es.wikipedia.org/wiki/Bytecode python.
Ejemplo: simplificar la sintaxis de meter código ensamblador desde Python.
Decoradores que manipulan las tripas de las funciones, a nivel de bytecode https://es.wikipedia.org/wiki/Bytecode.
Módulo "dis" https://docs.python.org/3/library/dis.html.
import dis
>>> def a():
... return 5
...
>>> dis.dis(a)
2 0 LOAD_CONST 1 (5)
2 RETURN_VALUE
inspect.iscoroutinefunction(object):
https://docs.python.org/3/library/inspect.html#inspect.iscoroutinefunction.
inspect.iscoroutine(object):
https://docs.python.org/3/library/inspect.html#inspect.iscoroutine.
inspect.isawaitable(object):
https://docs.python.org/3/library/inspect.html#inspect.isawaitable.
inspect.isasyncgenfunction(object):
https://docs.python.org/3/library/inspect.html#inspect.isasyncgenfunction.
inspect.isasyncgen(object):
https://docs.python.org/3/library/inspect.html.
Problemas con el "modo desarrollo" del paquete.
PEP 402 -- Simplified Package Layout and Partitioning: https://www.python.org/dev/peps/pep-0402/. Este PEP se rechazó.
PEP 382 -- Namespace Packages https://www.python.org/dev/peps/pep-0382/.
Ficheros pth:
https://docs.python.org/3/library/site.html.
Buenas prácticas actuales.
Se puso como deberes futuros.
Notas y capítulos para poder navegar por las grabaciones.
Temas pendientes para poder publicar los audios.
Biblioteca toc2audio: https://docs.jcea.es/toc2audio/.
MP3 https://es.wikipedia.org/wiki/Mp3 en formato VBR https://es.wikipedia.org/wiki/Tasa_de_bits_variable.
¿Dónde colgar las grabaciones? ¿Secuestrar y resucitar el podcast "Python en español": https://podcast.jcea.es/python/?
Consultas complejas usando el ORM https://es.wikipedia.org/wiki/Asignaci%C3%B3n_objeto-relacional.
Postgresql: https://www.postgresql.org/.
MySQL: https://www.mysql.com/.
MariaDB: https://mariadb.org/.
PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.
PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.
PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.
PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.
¿Deberes futuros?
What the f*ck Python! https://github.com/satwikkansal/wtfpython
Hablar de las cosas habiéndolas probado.
Real Python https://realpython.com/.
No hay contenido comparable en español.
Documentación Python en Español: https://docs.python.org/es/3/.
Documentación oficial de Python en español https://pyar.discourse.group/t/documentacion-oficial-de-python-en-espanol/238/23.
Documentación oficial de Python en Español https://elblogdehumitos.com/posts/documentacion-oficial-de-python-en-espanol/.
docs.python.org en Español https://elblogdehumitos.com/posts/docspythonorg-en-espanol/.
Problemas comunes de los organizadores: conseguir ponentes, reservar locales, conseguir subvenciones, gente que se apunta y luego no acude, etc.
Calendario de actividades tecnológicas en Madrid.
Latencia.
PulseAudio: https://es.wikipedia.org/wiki/PulseAudio.
Instrumentos VST: https://es.wikipedia.org/wiki/Virtual_Studio_Technology.
Jesús Cea ha escrito software de control de una emisora de radio. Detalles.
Biblioteca: https://docs.jcea.es/toc2audio/.
rnnoise: https://jmvalin.ca/demo/rnnoise/.
Audio procesado con "rnnoise": https://jmvalin.ca/demo/rnnoise/.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Jesús, conectando desde Ferrol.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Gato, desde Chile.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
¿Cómo empezamos a programar en Python?
Empezar con el tutorial: https://docs.python.org/es/3/tutorial/index.html.
Ensamblador: https://es.wikipedia.org/wiki/Lenguaje_ensamblador.
Python Vigo: https://www.python-vigo.es/.
Se intentaba montar algo en La Coruña.
Makerspaces: A Industriosa https://aindustriosa.org/.
Asociación Python España: https://www.es.python.org/.
Lista de correo Python-es: https://mail.python.org/mailman/listinfo/python-es.
Internet.
Las notas jugarán un papel importante en las grabaciones.
Capítulos.
Peer 2 Peer: https://es.wikipedia.org/wiki/Peer-to-peer.
webrtc: https://es.wikipedia.org/wiki/WebRTC.
Contribuir compartiendo las fotos de Python España.
BitTorrent: https://es.wikipedia.org/wiki/BitTorrent.
Complejidad ciclomática: https://es.wikipedia.org/wiki/Complejidad_ciclom%C3%A1tica.
Radon: https://pypi.org/project/radon/.
Cobertura de test: Coverage https://pypi.org/project/coverage/.
Cada pequeño paso ayuda.
Un libro gratis al día: https://www.packtpub.com/free-learning.
Bot de telegram de notificaciones diarias: https://t.me/packtpubfreelearning.
Bug poco prioritario.
Jesús Cea propone algunos rodeos al problema.
Hacer un proyecto pequeño.
Intentar no extenderse mucho, no hacer "muchas cosas".
Si no tiene base, el código del novato va a ser malo y con mucho más esfuerzo del necesario. Hace falta cierto tutelaje.
Examinar un proceso ajeno "pequeño" y estudiarlo.
Project Euler: https://projecteuler.net/.
Ventajas de un libro: Aprendizaje estructurado, gradual y que prioriza lo importante.
Aprende Python en un fin de semana || Libro – PDF – EPUB – Descargar https://elcientificodedatos.com/aprende-python-en-un-fin-de-semana/.
Python España: Aprende Python https://www.es.python.org/pages/aprende-python.html.
Comunidades locales.
¿Alguien que no sabe programar en absoluto entiende qué
significa a = a + 1?
Commodore VIC-20: https://en.wikipedia.org/wiki/Commodore_VIC-20.
Escribir código a mano puede ayudar.
OWASP: https://owasp.org/.
OWASP Top Ten Web Application Security Risks: https://owasp.org/www-project-top-ten/.
Listas de correo de seguridad.
Desbordamiento de búfer: https://es.wikipedia.org/wiki/Desbordamiento_de_buffer.
Podcast: Security Now https://twit.tv/shows/security-now.
Hispasec: Noticias de seguridad diaria: Una al Día: https://unaaldia.hispasec.com/.
The CERT C Secure Coding Standard https://www.amazon.com/CERT-Secure-Coding-Standard/dp/0321563212.
Cada lenguaje tiene sus propios fallos de seguridad típicos, propios de las idiosincrasias o el estilo de ese lenguaje.
Si el "framework" es popular y se le encuentra un bug, eres susceptible a un ataque masivo.
Hay que preocuparse de tenerlo actualizado.
Django: https://www.djangoproject.com/.
Ataque de cadena de suministro: https://es.wikipedia.org/wiki/Ataque_a_cadena_de_suministro.
Docker: https://www.docker.com/.
¿Quién se preocupa de actualizarlo?
DB-API 2.0: PEP 249 -- Python Database API Specification v2.0 https://www.python.org/dev/peps/pep-0249/.
Aunque un lenguaje de programación sea razonablemente seguro, los programadores introducen fallos de seguridad en su código. Algunos ejemplos.
eval: https://docs.python.org/3/library/functions.html#eval.
Poison packages – “Supply Chain Risks” user hits Python community with 4000 fake modules: https://nakedsecurity.sophos.com/2021/03/07/poison-packages-supply-chain-risks-user-hits-python-community-with-4000-fake-modules/.
Cualquiera puede subir un módulo nuevo a PYPI: https://pypi.org/.
La reputación no basta.
Trabajo ingrato.
Depender del trabajo voluntario es un problema.
Hay una diferencia entre código con bugs y ataques maliciosos conscientes.
Ejemplo, Antivirus. VirusTotal: https://www.virustotal.com/gui/, Hispasec https://hispasec.com/es/.
Un clásico de 1984: "Reflections on Trusting Trust": https://users.ece.cmu.edu/~ganger/712.fall02/papers/p761-thompson.pdf.
Referencia obligada a XKCD https://xkcd.com/:
Dependency https://xkcd.com/2347/.
Wikipedia XKCD: https://es.wikipedia.org/wiki/Xkcd.
OpenSSL https://es.wikipedia.org/wiki/OpenSSL:
WordPress: https://es.wikipedia.org/wiki/WordPress.
Red Hat: https://es.wikipedia.org/wiki/Red_Hat.
Opinión de Jesús Cea: Se vende tranquilidad, no seguridad.
Desplazas la responsabilidad a otro.
Gestión de riesgo. Proteger su puesto de trabajo.
"No han despedido nunca a nadie por comprar IBM": https://loscuenca.com/2010/04/nunca-han-despedido-a-nadie-por-contratar-a-______/
Documentación Python en Español: https://docs.python.org/es/3/.
Documentación oficial de Python en español https://pyar.discourse.group/t/documentacion-oficial-de-python-en-espanol/238/23.
Documentación oficial de Python en Español https://elblogdehumitos.com/posts/documentacion-oficial-de-python-en-espanol/.
docs.python.org en Español https://elblogdehumitos.com/posts/docspythonorg-en-espanol/.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Javier, conectando desde Madrid.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Las Palmas.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
José Juan.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Pablo Gómez, twitter: @julebek, nuestro sufrido editor de audio, está enviando a Jesús Cea ya algunos audios procesados.
Capítulos en audios: Biblioteca toc2audio https://docs.jcea.es/toc2audio/.
Jesús Cea quiere notas exhaustivas de cada grabación. El audio es casi redundante. Lo que estás leyendo ahora mismo, vaya.
Ojo, teclear este código tal cual puede tumbar tu máquina y puedes necesitar reiniciar, perdiendo lo que estés haciendo con el ordenador.
(1<<19**8,)*2
(1<<19**8,)*4**7
Build a Compiler Bomb: Python 3, 13 byte source, 9,057,900,463 byte (8.5GiB) .pyc-file / Python 3, 16 byte source, >32TB .pyc-file (if you have enough memory, disk space and patience) https://codegolf.stackexchange.com/questions/69189/build-a-compiler-bomb/69415#69415.
16 bytes of Python code compiles to 32 terabytes of bytecode https://www.reddit.com/r/Python/comments/llccey/16_bytes_of_python_code_compiles_to_32_terabytes/.
La sintaxis de Python es cada vez más compleja.
Jesús Cea se sorprende de que Guido van Rossum https://es.wikipedia.org/wiki/Guido_van_Rossum esté "pervertiendo" tanto Python.
Muchos cambios de sintaxis se justifican para ciertos usuarios (cálculo numérico) y resulta que a esos usuarios no les está preguntando nadie.
Los lenguajes empiezan simples y se van complicando... siendo reemplazados por otros lenguajes que empiezan simples.
Estos temas se han tratado con frecuencia y profundidad en tertulias anteriores.
El lenguaje se particiona en "sublenguajes" y "subculturas".
BNF (Backus–Naur form): https://es.wikipedia.org/wiki/Notaci%C3%B3n_de_Backus-Naur.
JavaScript: The Good Parts: https://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742.
¿Cómo aprende Python la gente novata?
Grupos de excepciones: PEP 654 https://www.python.org/dev/peps/pep-0654/.
asyncio https://docs.python.org/3/library/asyncio.html contamina todo tu código.
Cuando se actualiza un PEP, no cambia de numeración.
Black: https://pypi.org/project/black/.
Los PEP incluyen una sección de cambios, historia del PEP.
PEP 494 -- Python 3.6 Release Schedule https://www.python.org/dev/peps/pep-0494/.
PEP 373 -- Python 2.7 Release Schedule https://www.python.org/dev/peps/pep-0373/.
Deuda técnica.
Estrategia: Bloquear dependencias.
Acumular actualizaciones tampoco es buena idea.
Que tus tests comprueben tus dependencias suele ser una mala práctica, pero para los tests de integración puede ser buena idea para asegurarse la estabilidad del ecosistema del proyecto.
pip freeze https://pip.pypa.io/en/stable/cli/pip_freeze/.
virtualenv: https://pypi.org/project/virtualenv/.
pip install. Paquetes
maliciosos.
Pybonacci: https://pybonacci.org/.
Chema Cortés: https://blog.ch3m4.org/.
AlgoriSoft: https://algorisoft.com/. Cursos de Django https://www.djangoproject.com/.
Este audio tiene mucho ruido producido por el roce del micrófono de Jesús Cea en la ropa.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Javier, conectando desde Madrid.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
id() se reutilizan cuando se liberan objetos.
id(). No es una identidad persistente,
depende de su direcciñon de memoria y la memoria se
reutiliza cuando se liberan objetos.Lista de correo de Python Ideas: https://mail.python.org/mailman3/lists/python-ideas.python.org/.
Si usas la funcionalidad, la sintaxis y semántica de las excepciones se modifica.
Como ocurrió con async y await, si alguno de los
paquetes nuevos usa esta funcionalidad, te contaminará tu
propio código.
Tener varias versiones instaladas de Python.
make altinstall es tu amiga para poder instalar varias
versiones diferentes de Python a la vez en el sistemas
operativo.
Diferencia entre llamar a python3 y llamar a python3.6.
Matriz de tests.
Flake8: https://pypi.org/project/flake8/.
Si código Python 3 funciona en Python 2... ¿El código era Python 3 realmente?
Proyectos con compatibilidad mal especificada.
pyenv: https://pypi.org/project/pyenv/.
Pylint: https://pypi.org/project/pylint/.
Reformateador de código "nazi".
Se acabaron las discusiones de estilo.
¿Puede un formateador "nazi" ser configurable? ¿No es un oxímoron?
gitlint: https://jorisroovers.com/gitlint/.
vim-autopep8: https://vim-autopep8.readthedocs.io/en/latest/.
Grupos de excepciones: PEP 654 -- Exception Groups and except* https://www.python.org/dev/peps/pep-0654/.
async/await.PEP 622 -- Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.
PEP 634 -- Structural Pattern Matching: Specification https://www.python.org/dev/peps/pep-0634/.
PEP 635 -- Structural Pattern Matching: Motivation and Rationale https://www.python.org/dev/peps/pep-0635/.
PEP 636 -- Structural Pattern Matching: Tutorial https://www.python.org/dev/peps/pep-0636/.
Happy birthday, Python, you're 30 years old this week: Easy to learn, and the right tool at the right time https://www.theregister.com/2021/02/20/python_at_30/.
Compilación en sistemas operativos modernos: https://github.com/smontanaro/python-0.9.1.
Programar funciones de comparación personalizadas.
Definir tipos personalizados que sepan compararse entre sí.
Problemas al migrar un sistema de persistencia de Python 2 a Python 3.
import PIL, la librería que reemplazó
hace eones?
Confuso.
Casos similares (hay muchos más):
python-dateutil https://pypi.org/project/python-dateutil/.
Beautiful Soup: https://pypi.org/project/beautifulsoup4/.
dnspython https://pypi.org/project/dnspython/.
Antes había contadores de descargas.
Ahora tenemos: (depende de Google)
PyPI Download Stats https://pypistats.org/.
pypinfo https://pypi.org/project/pypinfo/.
Encima dependes de ellos y queman el mercado para servicios comerciales.
La resignación y pasividad de los usuarios.
Por ejemplo: Videojuegos en red con servidores.
GeoCities https://es.wikipedia.org/wiki/GeoCities.
Package signing & detection/verification: https://github.com/pypa/warehouse/milestone/16.
Red distribuida por IPFS https://es.wikipedia.org/wiki/Sistema_de_archivos_interplanetario o BitTorrent https://es.wikipedia.org/wiki/BitTorrent.
PYPI proporciona RSS https://es.wikipedia.org/wiki/Rss.
PyPI recent updates https://pypi.org/rss/updates.xml.
PyPI newest packages https://pypi.org/rss/packages.xml.
Dinámicas de colaboración en proyectos de código abierto.
Core developer de Python: Mariatta Wijaya - What is a Python Core Developer? https://www.youtube.com/watch?v=hhj7eb6TrtI.
La importancia de la realimentación.
La compresión de datos en WebDAV.
Que la gestión de base de datos sea Python.
Bajar la barrera de entrada al proyecto.
Blockchain https://es.wikipedia.org/wiki/Cadena_de_bloques.
BitCoin desarrolla ideas muy interesantes.
Prueba de trabajo: https://es.wikipedia.org/wiki/Sistema_de_prueba_de_trabajo.
Cypherpunk: https://en.wikipedia.org/wiki/Cypherpunk.
Contrato inteligente: https://es.wikipedia.org/wiki/Contrato_inteligente.
Datos abiertos: https://es.wikipedia.org/wiki/Datos_abiertos.
Participantes:
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Javier, conectando desde Madrid.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Google docs: https://docs.google.com.
Wikis en GitHub: https://docs.github.com/en/communities/documenting-your-project-with-wikis/about-wikis.
Ventajas de tener la documentación en el control de versiones del proyecto.
Ventajas de ir escribiendo la documentación mientras escribes el propio código: Realimentación.
Sphinx: https://www.sphinx-doc.org/en/master/.
sphinx.ext.autodoc: https://www.sphinx-doc.org/en/master/usage/extensions/autodoc.html.
plantuml: https://github.com/sphinx-contrib/plantuml.
Markdown: https://www.markdownguide.org/.
La documentación guía el desarrollo.
Paralelismo con los tests.
Funciona como una biblioteca tradicional.
Préstamo de libros.
Están escaneando a toda velocidad: 2.5 millones de libros en el momento de escribir estas notas (mayo de 2021).
Internet Archive: https://archive.org/.
Wayback Machine: https://web.archive.org/.
Preservación de videojuegos, páginas en flash, discos de música...
1997: https://web.archive.org/web/19970606181701/http://www.python.org/.
1998: https://web.archive.org/web/19981212032130/http://www.python.org/.
Un ejemplo de "batteries included": https://commons.wikimedia.org/wiki/File:Python_batteries_included.jpg.
¿"match" y "case" serán palabras reservadas?
PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.
Se repasa la funcionalidad un poco por encima.
Daiquiri: https://daiquiri.readthedocs.io/en/latest/.
Colorama: https://pypi.org/project/colorama/. Compatible con Windows.
Python -i: Ejecuta un script y pasa a modo
interactivo.
Comentado hace unas semanas.
También se puede hacer desde el propio código con
code.InteractiveConsole(locals=globals()).interact().
Jesús Cea se queja de que usando la invocación desde código
no funciona la edición de líneas. Javier da la pista correcta:
para que funcione, basta con hacer import readline antes de
lanzar el modo interactivo.
breakpoint() como función nativa: PEP 553 -- Built-in
breakpoint() https://www.python.org/dev/peps/pep-0553/.
import pdb; pdb.set_trace().
scrapy shell: https://docs.scrapy.org/en/latest/topics/shell.html.
Jesús Cea no echa de menos Scrapy https://docs.scrapy.org/en/latest/.
Jesús necesitaba ignorar tildes, lo que impacta en la extracción del lexema.
El backend está documentado, para que te lo puedas currar tú si lo necesitas.
Software para Django: https://www.djangoproject.com/.
REST: https://es.wikipedia.org/wiki/Transferencia_de_Estado_Representacional.
Permisos de usuario.
No hay cacheo.
Vulcain: https://github.com/dunglas/vulcain.
HTTP/2 Server Push: https://en.wikipedia.org/wiki/HTTP/2_Server_Push.
No se tiene que responder por orden. Multiplexación.
Volvemos a Structural Pattern Matching https://www.python.org/dev/peps/pep-0622/.
Complejidad de la sintaxis.
Un lenguaje pequeño y capaz reemplaza a lenguajes dinosaurio. Python reemplazó a otros lenguajes dinosaurio. Ahora Python es un dinosaurio. ¿Cuándo saldrá un lenguaje que reemplace a Python?
Closures: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
Ciertos cambios de sintaxis pueden unificar subculturas: "la forma oficial de hacerlo".
El operador ternario de Python v = VALOR1 if CONDICIÓN
else VALOR2: PEP 308 -- Conditional Expressions
https://www.python.org/dev/peps/pep-0308/.
List comprehension: [f(i) for i in ITER if
CONDICIÓN(i)]: PEP 202 -- List Comprehensions
https://www.python.org/dev/peps/pep-0202/.
True = 0. Esto funciona en Pythonn 2.7. Es algo que
se cambió en Python 3.0:
https://docs.python.org/3.0/whatsnew/3.0.html#changed-syntax.
>>> all([])
True
>>> all([[]])
False
>>> all([[[]]])
True
Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.
Issue9914: trace/profile conflict with the use of
sys.modules[__name__] https://bugs.python.org/issue9914.
Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.
Requiere mejorar el módulo runpy
https://docs.python.org/3/library/runpy.html.
A nadie le ha dolido lo suficiente el bug como para solucionarlo. No es que sea realmente difícil. Tal vez sí.
Ejecutables Python independientes de lo que tengas instalado en el sistema. Por ejemplo, para poder usar una versión de Python "moderna".
También funciona en MS Windows.
Combinación de caracteres unicode.
Las banderas de los países, por ejemplo, son un código "bandera" seguido del código del país: https://en.wikipedia.org/wiki/Regional_indicator_symbol.
La bandera de Taiwan se ve distinta en China que en el resto del mundo: https://emojipedia.org/flag-taiwan/.
"Collation" https://en.wikipedia.org/wiki/Unicode_collation_algorithm, para ordenar y comparar correctamente caracteres unicode: PyICU: https://pypi.org/project/PyICU/.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Javier, conectando desde Madrid.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
FOSDEM https://fosdem.org/.
Escuchar audios previos para ver errores y comentar "erratas".
Detalles de cómo grabamos las tertulias.
Todo se graba en una sola pista :-(.
Ideas para automatizar el proceso.
Las bibliotecas solo se cargan una vez en el programa,
aunque se hagan muchos import en el código.
sys.modules
https://docs.python.org/3/library/sys.html#sys.modules.
Dependencias transitivas.
Subintérpretes Python. PEP 554: https://www.python.org/dev/peps/pep-0554/.
Módulos en C: PEP 489 -- Multi-phase extension module initialization https://www.python.org/dev/peps/pep-0489/.
¡Más sintaxis nueva!
PEP 617 -- New PEG parser for CPython https://www.python.org/dev/peps/pep-0617/.
PEP 414 -- Explicit Unicode Literal for Python 3.3 https://www.python.org/dev/peps/pep-0414/.
Jesús Cea opina que la migración de Python 2 a Python 3 se hizo mal y ha sido muy traumática.
¿Ajustarse estrictamente a 80 columnas?
Flake8: https://pypi.org/project/flake8/.
Tabulación de código.
La anotación de tipos puede gustar o no, pero de momento es opcional.
Tema recurrente: ¿Qué es ser pythonico?
Origen de MYPY: http://mypy-lang.org/.
Aportar información al IDE https://en.wikipedia.org/wiki/Integrated_development_environment.
Valor a la hora de documentar los tipos en los API https://en.wikipedia.org/wiki/API.
El cliente web solo envía eventos al servidor y recibe cambios al DOM https://es.wikipedia.org/wiki/Document_Object_Model enviadas por el servidor.
Abre la posibilidad olvidarnos de JavaScript: https://es.wikipedia.org/wiki/JavaScript.
ItsNat: https://en.wikipedia.org/wiki/ItsNat.
Interactuar con otros lenguajes.
Python en Java, interactuando sin dolor: Jython https://www.jython.org/.
Valor de Python como lenguaje fácil de entender y pseudocódigo.
Tutorial de Python: https://docs.python.org/es/3/tutorial/index.html.
En Unix se suele hacer: write + flush + rename.
MS Windows eso no funciona.
Python 3.3 añadió os.replace()
https://docs.python.org/3.8/library/os.html#os.replace.
En MS Windows es atómico... casi siempre: Issue8828: Atomic function to rename a file https://bugs.python.org/issue8828.
@overload
https://docs.python.org/3/library/typing.html#typing.overload.
@functools.singledispatch
https://docs.python.org/3/library/functools.html.
¿Qué se ve cuando salta una excepción?
Especializaciones.
Cython https://cython.org/.
Hilo en la lista de correo: "[Python-es] Biblioteca XPATH" https://mail.python.org/pipermail/python-es/2021-February/037931.html.
lxml: https://lxml.de/.
beautifulsoup4: https://pypi.org/project/beautifulsoup4/.
Scrapy: https://scrapy.org/.
El buscador de PyPI https://pypi.org/ funciona fatal a la hora de ordenar por relevancia.
Es la documentación última.
Los tests son muy útiles para saber cómo se usa el producto.
Brainstorming de diversas estrategias.
Berkeley DB: https://pypi.org/project/berkeleydb/.
Multiversion concurrency control: https://es.wikipedia.org/wiki/Multiversion_concurrency_control.
Copy on Write: https://es.wikipedia.org/wiki/Copy_on_write.
Snapshot: https://es.wikipedia.org/wiki/Copia_instant%C3%A1nea_de_volumen.
PostgreSQL: https://www.postgresql.org/.
ZFS: https://es.wikipedia.org/wiki/ZFS_(sistema_de_archivos).
Normalización y formas normales: https://es.wikipedia.org/wiki/Forma_normal_(base_de_datos).
Virako recomienda las siguientes:
Some SQL Tricks of an Application DBA - Non-trivial tips for database development https://fosdem.org/2021/schedule/event/postgresql_some_sql_tricks_of_an_application_dba/.
Database Disasters and How to Find Them https://fosdem.org/2021/schedule/event/postgresql_database_disasters_and_how_to_find_them/.
Practical advice for using Mypy - Hidden gems in the typing system! https://fosdem.org/2021/schedule/event/python_mypy/.
Escaping the Cargo Cult - How to structure your project without losing your mind. https://fosdem.org/2021/schedule/event/python_escaping_cargo_cult/.
__main__.
Se trata de un problema conocido.
Ejemplo de código: https://pastebin.com/vGM1sh8r.
Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.
Issue9914: trace/profile conflict with the use of
sys.modules[__name__] https://bugs.python.org/issue9914.
Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.
En este audio hay un hablante que no identifico. ¿Quien es?. Es quien habla, por ejemplo, en 01:06:00 o en 01:12:00. ¿Antoni?
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Dani, conectando desde Málaga.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Design of CPython’s Garbage Collector: https://devguide.python.org/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 transcendental.
Dinámica de las tertulias.
Raspberry Pi Pico: https://www.raspberrypi.org/products/raspberry-pi-pico/.
Micropython: https://www.micropython.org/.
__main__.
Se trata de un problema conocido.
Ejemplo de código: https://pastebin.com/vGM1sh8r.
Issue24676: Error in pickle using cProfile https://bugs.python.org/issue24676.
Issue9914: trace/profile conflict with the use of
sys.modules[__name__] https://bugs.python.org/issue9914.
Issue9325: Add an option to pdb/trace/profile to run library module as a script https://bugs.python.org/issue9325.
Sigue fallando mucho.
Linter: https://es.wikipedia.org/wiki/Lint.
Impone disciplina y una cultura.
Las anotaciones de tipos no se verifican en tiempo de ejecución. Se usan en el sistema de test e integración continua.
Una de la ventaja de los "__slots__" es que si te
equivocas en el nombre de atributo en una asignación, te
dará un error claro. Los tipos ayudan aquí también.
"pyannotate" https://pypi.org/project/pyannotate/.
Las anotaciones de tipos te permiten luego compilar Python para ganar rendimiento "sin coste".
Las anotaciones se pueden meter en el mismo código o en un fichero "compañero".
Usar un fichero "compañero" es útil para poder usar anotaciones modernas en versiones antiguas de Python.
Evitar "contaminar" el sistema de control de versiones con cambios masivos irrelevantes que ofuscan la historia de un proyecto. Por ejemplo, el autor original del código.
Que los creadores de código y los etiquetadores de tipos sean personas diferentes.
"typeshed": Collection of library stubs for Python, with static types: https://github.com/python/typeshed.
¿Y meter tipos en los comentarios, como se hacía antiguamente?
Hay mucha literatura de ingeniería de software sobre si es bueno documentar tipos o no, según el tipo de equipo y el tipo de proyecto.
Descubrimiento de tipos en tiempo de ejecución.
Tema recurrente.
Numba: https://numba.pydata.org/.
Javascript V8: https://en.wikipedia.org/wiki/V8_(JavaScript_engine).
Complejidad y compatibilidad.
Faltan manos.
Hay muchos "gérmenes" que no germinan.
Dispersión de esfuerzos.
Tipos.
Velocidad.
Espacios significantes.
Cada novedad de sintaxis de Python cambia el lenguaje. ¿Qué es Python?
Hay organizaciones grandes que un lenguaje sin tipos ni siquiera lo consideran.
La cultura va evolucionando.
Solución de compromiso: Meter tipos solo en la frontera.
>>> [i for i in ('a', '' ,'b') if i := i.strip()]
File "<stdin>", line 1
[i for i in ('a', '' ,'b') if i := i.strip()]
^
SyntaxError: invalid syntax
No queda otra que escribirlo como:
>>> [i.strip() for i in ('a', '' ,'b') if i.strip()]
['a', 'b']
duplicando el i.strip().
continue en un finally. El texto era
https://docs.python.org/3.7/reference/compound_stmts.html#the-try-statement:
When a return, break or continue statement is executed in the try suite of a try...finally statement, the finally clause is also executed ‘on the way out.’ A continue statement is illegal in the finally clause. (The reason is a problem with the current implementation — this restriction may be lifted in the future).
datetime
https://docs.python.org/3/library/datetime.html.
>>> a = 5
>>> f'{a=}'
'a=5'
Útil para el loging.
Herramientas para esto: "pip" https://pypi.org/project/pip/, "virtualenv" https://pypi.org/project/virtualenv/.
"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.
pip show.
Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.
hg
glog" https://www.mercurial-scm.org/.
Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.
Hora de sacar la basura garbage collector - Pablo Galindo y Victor Terrón - PyConES 2018 https://www.youtube.com/watch?v=G9wOSExzs5g.
La recolección de basura de la generación más antigua funciona de forma diferente. En vez de ser por un número fijo de desequilibrio entre creación y destrucción de objetos, funciona por porcentaje.
__slots__"
https://docs.python.org/3/reference/datamodel.html.
Website de "Real Python": https://realpython.com/. Merece bastante la pena.
También tienen podcast: "The Real Python Podcast: Python Tips, Interviews, and More" https://realpython.com/podcasts/rpp/.
__slots__"
https://docs.python.org/3/reference/datamodel.html.
Técnica estándar.
Un diccionario vacío ocupa 64 bytes: sys.getsizeof({}).
Se puede usar para evitar errores mecanográficos al escribir en atributos.
Le das un texto describiendo nodos y conexiones entre nodos y calcula un gráfico.
Sería trivial para dibujar el grafo de dependencias de "pip".
Ejemplo:
El gráfico de antes, con ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0002.png.
El gráfico de después, sin ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0003.png.
Expresiones regulares. Cuidado con el unicode https://en.wikipedia.org/wiki/Unicode. Mejor usar una lista blanca que una lista negra.
Usar pathlib.is_relative_to()
https://docs.python.org/3/library/pathlib.html#pathlib.PurePath.is_relative_to.
Novedad en Python 3.9.
Ventajas de compilar el intérprete desde código fuente para no depender de la versión que te proporciona el sistema operativo.
Puedes tener tu propio intérprete de Python dentro de un "virtualenv" https://pypi.org/project/virtualenv/.
Proyectos "llave en mano". El cliente quiere algo que se instale como un componente en lo que ya conoce. Por ejemplo, en un panel de configuración en un servicio de hospedaje.
Falta toda la base, pero... ¿Hace falta?
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Dani, conectando desde Málaga.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Jorge Rúa, conectando desde Vigo.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Raspberry Pi Pico: https://www.raspberrypi.org/products/raspberry-pi-pico/.
Micropython: https://www.micropython.org/.
Python -i: Ejecuta un script y pasa a modo
interactivo.
También se puede hacer desde el propio código con
code.InteractiveConsole(locals=globals()).interact().
Jesús Cea se queja de que usando la invocación desde código
no funciona la edición de líneas. Javier da la pista correcta:
para que funcione, basta con hacer import readline antes de
lanzar el modo interactivo.
datetime
https://docs.python.org/3/library/datetime.html.
Buena práctica: La respuesta al POST es una redirección a un GET. Patrón Post/Redirect/Get (PRG) https://es.wikipedia.org/wiki/Post/Redirect/Get.
Ventajas de usar un framework.
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 que sea posible. https://wiki.python.org/moin/Generators.
Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/.
Hora de sacar la basura garbage collector - Pablo Galindo y Victor Terrón - PyConES 2018 https://www.youtube.com/watch?v=G9wOSExzs5g.
Victor Mono: https://rubjo.github.io/victor-mono/.
Fira Code: https://fonts.google.com/specimen/Fira+Code.
Fira Code Retina: https://github.com/tonsky/FiraCode/issues/872.
En estas notas solo referenciamos los puntos a los que dedicamos más tiempo, se habló de más cosas.
El documento para poder seguir los comentarios de la grabación está en https://demo.hedgedoc.org/s/hEZB92q40#.
hash(float('inf')) -> 314159.
Yield:
Ojo con excepciones y filtraciones de memoria.
@contextlib.contextmanager
https://docs.python.org/3/library/contextlib.html#contextlib.contextmanager
y @contextlib.asynccontextmanager
https://docs.python.org/3/library/contextlib.html#contextlib.asynccontextmanager.
Aunque esté en la biblioteca estándar, no significa que sea pythónico:
asyncore: https://docs.python.org/3/library/asyncore.html. Está marcado como obsoleto desde Python 3.6.
Mover métodos funcionales en una librería separada.
Las dos jerarquías distintas que existían en Python 2. Esto se unificó en Python 3.
from __future__ import ....
La migración a Python 3 fue un intento de simplificar el lenguaje. Pero Python 3 se está complicando cada vez más.
collections.defaultdict():
https://docs.python.org/3/library/collections.html#collections.defaultdict.iter() y next() admiten una parametro extra
centinela opcional que especifica un valor que termina el
iterador.
None, porque
None puede ser un objeto válido.slice(1,100).
Pasar un iterador a una función abre posibilidades interesantes.
Slice Objects: https://docs.python.org/3/c-api/slice.html.
contextlib.suppress()
https://docs.python.org/3/library/contextlib.html#contextlib.suppress.
else: if, for, try,
while...
except ... IMPORTA.
collections.deque:
https://docs.python.org/3/library/collections.html.
dateutil: https://pypi.org/project/python-dateutil/.
itertools:
https://docs.python.org/3/library/itertools.html.
if a < x < b:
>>> import dis
>>> dis.dis(lambda x: a < x < b)
1 0 LOAD_GLOBAL 0 (a)
2 LOAD_FAST 0 (x)
4 DUP_TOP
6 ROT_THREE
8 COMPARE_OP 0 (<)
10 JUMP_IF_FALSE_OR_POP 18
12 LOAD_GLOBAL 1 (b)
14 COMPARE_OP 0 (<)
16 RETURN_VALUE
>> 18 ROT_TWO
20 POP_TOP
22 RETURN_VALUE
Desempaquetado complejo:
>>> a, b, (c, d), *e, f = 1, 2, (3, 4), 5, 6, 7, 8, 9
>>> print(a,b,c,d,e,f)
1 2 3 4 [5, 6, 7, 8] 9
Usar la variable "guión bajo" para descartar valores. Ojo con la internacionalización.
Operador morsa. Tratado con projilidad en tertulias anteriores.
Parámetros mutables.
Definir "closures" dentro de un for pero usarlo fuera.
Tuplas con un solo elemento. Es más evidente el constructor
tuple(), pero ojo: tuple('abc') -> ('a', 'b', 'c').
dis
https://docs.python.org/3/library/dis.html y enum
https://docs.python.org/3/library/enum.html.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
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: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Mucha tela que cortar.
Diferencia semántica entre verbos HTTP: GET y POST https://en.wikipedia.org/wiki/POST_(HTTP).
Algunos recursos de seguridad web (no exhaustivo, la lista es infinita):
CSRF: https://es.wikipedia.org/wiki/Cross-site_request_forgery.
Cross-Origin Resource Sharing (CORS) https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS.
Content Security Policy Reference https://content-security-policy.com/.
La documentación de FastAPI https://fastapi.tiangolo.com/ tiene mucho de seguridad:
CORS (Cross-Origin Resource Sharing): https://fastapi.tiangolo.com/tutorial/cors/.
OAuth2 with Password (and hashing), Bearer with JWT tokens https://fastapi.tiangolo.com/tutorial/security/oauth2-jwt/.
About HTTPS https://fastapi.tiangolo.com/deployment/https/.
Se está moviendo otra vez la inteligencia del navegador al servidor.
Brython: https://brython.info/.
Pyjs (antiguo Pyjamas): https://en.wikipedia.org/wiki/Pyjs.
Emscripten: https://emscripten.org/.
Versionado de diccionarios. PEP 509 Add a private version to dict: https://www.python.org/dev/peps/pep-0509/.
Compilación al vuelo: Pyjion: https://pyjion.readthedocs.io/en/latest/index.html.
Conflicto con la portabilidad del intérprete.
numba: https://numba.pydata.org/.
Hay pocos "core developers" y heredar código avanzado que luego hay que mantener es un problema.
Cython: https://cython.org/. Rendimiento y ofuscación.
nuitka: https://nuitka.net/.
numba: https://numba.pydata.org/.
PyPy: https://www.pypy.org/.
Issue 26647: ceval: use Wordcode, 16-bit bytecode: https://bugs.python.org/issue26647.
Issue 9203: Use computed gotos by default: https://bugs.python.org/issue9203.
Cython: https://cython.org/.
MYPY: http://mypy-lang.org/.
Especialización.
Implementaciones en Python: Sistemas de persistencia como Durus https://www.mems-exchange.org/software/DurusWorks/ o ZODB http://www.zodb.org/.
Mucha discusión sobre el GIL: https://en.wikipedia.org/wiki/Global_interpreter_lock.
La atomicidad de operaciones no está documentada en ningún sitio.
>>> def rutina(n):
... n += 1
... n = n + 1
...
>>> dis.dis(rutina)
2 0 LOAD_FAST 0 (n)
2 LOAD_CONST 1 (1)
4 INPLACE_ADD
6 STORE_FAST 0 (n)
3 8 LOAD_FAST 0 (n)
10 LOAD_CONST 1 (1)
12 BINARY_ADD
14 STORE_FAST 0 (n)
16 LOAD_CONST 0 (None)
18 RETURN_VALUE
¿Por qué Jesús Cea se ha hecho su propio scraper web?
"Maldades".
scrapy: https://scrapy.org/.
Event sourcing: https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome.
Logs de modificaciones.
Concurrencia.
tarpit.
Problemas habituales:
Normalización de URLs.
Webs mal formadas.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
José Luis, conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Las listas de Numpy https://numpy.scipy.org/ no son como las listas de Python.
statistics: https://docs.python.org/3/library/statistics.html
Hacer scraping web sin usar Scrapy https://scrapy.org/.
¿Cuánto ocupa ese objeto en memoria?
Se oculta la complejidad, se trabaja a más alto nivel.
Ineficiencia.
Ventajas de tener servidores dedicados.
¿Y los backups?
Contenedores Solaris: https://en.wikipedia.org/wiki/Solaris_Containers.
Hipervisor: https://es.wikipedia.org/wiki/Hipervisor.
Ansible: https://es.wikipedia.org/wiki/Ansible_(software).
Una utilidad de los tests es enseñarte cómo usar un proyecto. A veces la documentación formal es muy mala.
pytest: https://docs.pytest.org/en/6.2.x/.
Problemas con la licencia.
Imposible ponerse en contacto con sus autores originales.
¿Hacer un fork hostil? https://es.wikipedia.org/wiki/Bifurcaci%C3%B3n_(desarrollo_de_software).
Por defecto, almacenamiento "cutre" en un fichero.
RelStorage: https://pypi.org/project/RelStorage/.
Jesús Cea: Berkeley DB Backend Storage Engine for DURUS: https://www.jcea.es/programacion/durus-berkeleydbstorage.htm.
Berkeley DB: https://es.wikipedia.org/wiki/Berkeley_DB.
Durabilidad regulable.
Group Committing.
Jesús Cea: Berkeley DB Backend Storage Engine for DURUS: https://www.jcea.es/programacion/durus-berkeleydbstorage.htm.
Versionado objeto por objeto. Se actualiza al ir cargando objetos durante el funcionamiento normal.
Versión de la base de datos. Migración de todos los objetos al arrancar el programa.
La migración es algo que no se explica nunca lo suficiente en la documentación.
Tutorial de Python en español: https://docs.python.org/es/3/tutorial/index.html.
Tutoriales progresivos.
La mayoría de las charlas son "introducción a ...". No aportan mucho.
Las mejores charlas son los postmortem.
Pegas, pero desde un punto de vista constructivo y realista.
Es más interesante conocer los puntos débiles.
Kaleidos: https://kaleidos.net/.
Meetup Python Madrid: https://www.meetup.com/python-madrid/.
Nostalgia de los "buenos tiempos".
Networking entre personas.
super()
https://docs.python.org/3/library/functions.html#super.
Tema recurrente.
What Color is Your Function? https://journal.stuffwithstuff.com/2015/02/01/what-color-is-your-function/.
Go: https://golang.org/.
Corrutina: https://es.wikipedia.org/wiki/Corrutina.
CSP: https://en.wikipedia.org/wiki/Communicating_sequential_processes.
La implementación actual en Python no es transparente, "colorea" todo el programa.
Documentación: https://github.com/stackless-dev/stackless/wiki.
¿Por qué no se integró en CPython? Portabilidad.
Logotipo de Python Madrid: https://www.python-madrid.es/.
Condiciones de uso del logo de Python: https://www.python.org/community/logos/.
"Closures".
Respuestas "de nivel" en las listas de correo cuando la pregunta es interesante.
Versionado de diccionarios.
Cacheo de "lookups" en la implementación actual de Python.
Mercurial de Jesús Cea: http://hg.jcea.es/.
El código publicado no es bueno. Personal. Hago lo mínimo para que funcione.
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 código abierto, por ejemplo, gente joven sin cargas familiares.
Ideas interesantes, código regulero.
Tener claros los "puntos de dolor".
Hacer lo mínimo imprescindible.
Máquinas limitadas como la Raspberry PI: https://es.wikipedia.org/wiki/Raspberry_Pi.
Recibir notificaciones de cambios en el disco duro: Watchman: https://github.com/facebook/watchman.
Entrega de valor constante e incremental.
Metodologías ágiles.
El cliente nunca tiene tiempo para probar las entregas.
Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.
Temas de estilo.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Juan Carlos, conectando desde Bilbao.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Don’t Use Recursion In Python Any More,Python Closure — A Pythonic technique you must know: https://towardsdatascience.com/dont-use-recursion-in-python-any-more-918aad95094c.
Hilo en la lista de correo de Python Madrid: https://lists.es.python.org/pipermail/madrid/2021-January/004838.html.
Closure: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
Twisted daña el cerebro: https://twistedmatrix.com/trac/.
Black: https://pypi.org/project/black/.
from __future__ import braces.
' o ".
Cuando tienes if ... else ..., ¿Qué caso pones primero?,
¿el corto o el largo? ¿Primero la condición normal?
Microoptimizaciones que complican la legibilidad sin ganancia de rendimiento que importe en realidad.
Dispositivo de Duff: https://es.wikipedia.org/wiki/Dispositivo_de_Duff.
El "bytecode" https://es.wikipedia.org/wiki/Bytecode que genera Python no está nada optimizado. Es mejorable.
a + a:
>>> dis.dis(lambda a: a + a)
1 0 LOAD_FAST 0 (a)
2 LOAD_FAST 0 (a)
4 BINARY_ADD
6 RETURN_VALUE
¡Guardas!
Sí se hacen algunas optimizaciones simples:
>>> dis.dis(lambda : 5 + 3)
1 0 LOAD_CONST 1 (8)
2 RETURN_VALUE
Máquina virtual de registros en vez de máquina virtual orientada a pila.
Muchas operaciones redundantes:
>>> import dis
>>> def suma(valores):
... s=0
... for i in valores:
... s+=i
... return s
...
>>> dis.dis(suma)
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (s)
3 4 LOAD_FAST 0 (valores)
6 GET_ITER
>> 8 FOR_ITER 12 (to 22)
10 STORE_FAST 2 (i)
4 12 LOAD_FAST 1 (s)
14 LOAD_FAST 2 (i)
16 INPLACE_ADD
18 STORE_FAST 1 (s)
20 JUMP_ABSOLUTE 8
5 >> 22 LOAD_FAST 1 (s)
24 RETURN_VALUE
¿Qué ocurre a la hora de depurar o para gestionar excepciones?
¡Guardas!
NOTA DESDE EL FUTURO:
Python 3.9.5: https://docs.python.org/release/3.9.5/whatsnew/changelog.html.
Traceback objects allow accessing frame objects without triggering audit hooks: https://bugs.python.org/issue42800.
La complejidad debe estar en tu programa, no en el lenguaje o el intérprete.
Compiladores optimizadores. Python se está quedando atrás.
Hacer caché al buscar atributos:
Issue1616125: Cached globals+builtins lookup optimization: https://bugs.python.org/issue1616125.
issue43452: Microoptimize PyType_Lookup for cache hits https://bugs.python.org/issue43452.
Detectar cambios en un diccionario, incluyendo
diccionarios internos como locals o __builtins__:
PEP 509 Add a private version to dict:
https://www.python.org/dev/peps/pep-0509/.
from __future__ import braces.
import antigravity.
import this.
import __hello__.
pass o ... (ellipsis).
Es algo interno para el API de C. No está accesible desde Python.
Cambios pequeños pueden abrir posibilidades interesantes. ¡Guardas!.
traceback.clear_frames(tb):
https://docs.python.org/3/library/traceback.html#traceback.clear_frames.
Manipular frame.back.
Que una función sepa si se le está llamando de una forma síncrona o asíncrona.
Una biblioteca debe decidir si es síncrona o asíncrona y "contamina" todo tu código.
Hacer corrutinas "de verdad": https://es.wikipedia.org/wiki/Corrutina.
Persistencia y programación asíncrona.
Concepto de "awaitable": https://docs.python.org/3/library/asyncio-task.html#awaitables.
future.result():
https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Future.result.
Vuelve a tratarse el tema de si la biblioteca estándar debe crecer o adelgazar.
Según Jesús Cea, asyncio https://docs.python.org/3/library/asyncio.html es la peor opción.
Alternativas a asyncio:
Trio: https://trio.readthedocs.io/en/stable/. Monkey patching: https://en.wikipedia.org/wiki/Monkey_patch.
La dificultad de luchar con una biblioteca que está incluída en la biblioteca estándar.
concurrent.futures
https://docs.python.org/3/library/concurrent.futures.html que
threading https://docs.python.org/3/library/threading.html
directamente.
Transportar excepciones entre hilos.
Control de carga y paralelismo.
Queda por ultimar el detalle de cómo solucionar el problema exactamente y enviar el parche para que se integre oficialmente en Python.
Jesús Cea describe las dos opciones que está barajando:
weakrefs https://docs.python.org/3/library/weakref.html o
try ... finally.
Participantes:
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Juan Carlos.
Plutarco, conectando desde Madrid.
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Julio, conectando desde Chile.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
PyCharm: https://www.jetbrains.com/pycharm/.
Atajos de teclado.
vim: https://es.wikipedia.org/wiki/Vim.
Uso del teclado en vez del ratón.
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:
buf = f.read(1000)
while buf:
[Hace el procesamiento]
buf = f.read(1000)
A lo siguiente:
while buf := f.read(1000):
[Hace el procesamiento]
Migración de Python a Github fue en 2017.
No es "Steering committee" sino "Steering Council".
Charla de Pablo Galindo en la PyconES 2019 sobre el mundo de los Core Developers de Python: https://www.youtube.com/watch?v=qcvZOaY1emk.
Algunos proyectos Python están usando Rust. Por ejemplo: https://cryptography.io/, con cierta polémica. Mercurial también usa Rust https://www.mercurial-scm.org/.
Las variables locales pueden ser modificadas a través de su "closure", en funciones hijas o en otros hilos. Es una barbaridad, pero la posibilidad existe.
Esto es lo que hace, por ejemplo, un debugger.
Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.
Frame: https://docs.python.org/3/library/traceback.html#traceback.FrameSummary.
Stack: https://docs.python.org/3/library/traceback.html#stacksummary-objects.
Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.
Estamos continuando una conversación que ha durado varias tertulias.
Jesús Cea pone un ejemplo de cómo generar un ciclo con una excepcion.
La caja y media de cervezas se las lleva... ¡Jesús!
https://docs.python.org/3/library/exceptions.html#BaseException.with_traceback.
Puedes generar una excepción con un "traceback" arbitrario.
El caballo de batalla del bug es que el "future" https://docs.python.org/3/library/concurrent.futures.html levanta una excepción y esa excepción debe "transportarse" a otro hilo.
Explicando cómo se visualizan los "traceback" si un "future" https://docs.python.org/3/library/concurrent.futures.html muere con una excepción.
def a():
1/0
try:
a()
except Exception as e:
raise e
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
File "<stdin>", line 2, in <module>
File "<stdin>", line 2, in a
ZeroDivisionError: division by zero
Cuando un "future" https://docs.python.org/3/library/concurrent.futures.html lanza una excepción, se ven "frames" repetidos.
Hay varias formas de solucionar el bug. Ahora hay que pensar en cual elegir, que sea la más simple e intuitiva.
Dataclasses: https://docs.python.org/3/library/dataclasses.html. Se hablo mucho sobre ellas en la tertulia de la semana pasada.
Pydantic: https://pypi.org/project/pydantic/.
FastAPI: https://pypi.org/project/fastapi/.
Issue35930: Raising an exception raised in a "future" instance will create reference cycles https://bugs.python.org/issue35930.
Exploración del propio código fuente de Python.
Repaso detallado del funcionamiento de un "future" https://docs.python.org/3/library/concurrent.futures.html.
Uno de los problemas fundamentales de trabajar con hilos es cómo notificar excepciones a otros hilos. La gran ventaja de los "futures" es gestionar esto de forma trivial.
Este "transporte" es lo que está ocasionando el "Memory Leak".
¡Agárrate que vienen curvas!
self = None. Aquí se rompe el
ciclo en la excepción original:
https://github.com/python/cpython/blob/3.9/Lib/concurrent/futures/thread.py#L47.
Closures: https://es.wikipedia.org/wiki/Clausura_(inform%C3%A1tica).
"Pool" de "workers". De forma estándar, Python te proporciona dos ejecutores: el ejecutor de hilos y el ejecutor de procesos https://docs.python.org/3/library/concurrent.futures.html#executor-objects.
try ... finally
Jejeje, alguien propone algo que funcionaría :-).
Se pueden "resucitar" objetos.
El gráfico de antes, con ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0002.png.
El gráfico de después, sin ciclos: https://lists.es.python.org/pipermail/general/attachments/20201229/0c14bc58/attachment-0003.png.
Por sus características... complicado.
"sys.getrefcount()": https://docs.python.org/3/library/sys.html#sys.getrefcount.
"sys.exc_info()": https://docs.python.org/3/library/sys.html#sys.exc_info.
"Race conditions": https://es.wikipedia.org/wiki/Condici%C3%B3n_de_carrera.
"gc.DEBUG_SAVEALL": https://docs.python.org/3/library/gc.html#gc.DEBUG_SAVEALL.
Se puede limpiar "gc.garbage" antes de la ejecución del código que nos interesa analizar.
Editar los audios.
Machine learning para el procesado de audio.
El problema del cocktail: https://en.wikipedia.org/wiki/Cocktail_party_effect y una solución aplicando inteligencia artificial: https://www.technologyreview.com/2015/04/29/168316/deep-learning-machine-solves-the-cocktail-party-problem/.
RNNoise https://jmvalin.ca/demo/rnnoise/.
Jesús ofrece algunos ejemplos de su utilidad.
En lo que sigue, cuando se habla de CPython, se refiere al intérprete de referencia de Python, que está escrito en lenguaje C: https://www.python.org/downloads/.
Participantes:
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Juan Carlos.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
>>> import dis
>>> def suma(valores):
... s=0
... for i in valores:
... s+=i
... return s
...
>>> dis.dis(suma)
2 0 LOAD_CONST 1 (0)
2 STORE_FAST 1 (s)
3 4 LOAD_FAST 0 (valores)
6 GET_ITER
>> 8 FOR_ITER 12 (to 22)
10 STORE_FAST 2 (i)
4 12 LOAD_FAST 1 (s)
14 LOAD_FAST 2 (i)
16 INPLACE_ADD
18 STORE_FAST 1 (s)
20 JUMP_ABSOLUTE 8
5 >> 22 LOAD_FAST 1 (s)
24 RETURN_VALUE
gc.set_threshold():
https://docs.python.org/3/library/gc.html#gc.set_threshold.
gc.disable():
https://docs.python.org/3/library/gc.html#gc.disable.
PEP 551 -- Security transparency in the Python runtime https://www.python.org/dev/peps/pep-0551/.
PEP 578 -- Python Runtime Audit Hooks https://www.python.org/dev/peps/pep-0578/.
SystemTap: https://es.wikipedia.org/wiki/SystemTap.
eBPF: https://ebpf.io/.
py-spy: https://github.com/benfred/py-spy.
bug bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.
¡Se ofrece una caja de cervezas!
Brainstorming.
Diagnóstico detallado.
weakref — Weak references: https://docs.python.org/3/library/weakref.html.
Se sube la apuesta a caja y media de cervezas :-).
La excepción salta en un hilo y se "transporta" y almacena para que se pueda acceder desde otro hilo.
Test reproducible.
El desarrollo se ha movido en github. Los bugs están a medio migrar, se va a integrar más en github.
https://pyfound.blogspot.com/2020/05/pythons-migration-to-github-request-for.html
PEP 581 -- Using GitHub Issues for CPython https://www.python.org/dev/peps/pep-0581/.
Guía del desarrollador: https://devguide.python.org/.
Backporting de bugs de cpython de la versión en desarrollo a las versiones estables.
¿Cómo se obtiene y se pierde el status de "core developer"?
Steering council. PEP 8016: https://www.python.org/dev/peps/pep-8016/. Rol que cumple y cómo se elige.
Desde que Guido no es BDFL, está muy activo en listas de correo y picando código.
Se escribe en C lo que no tiene más remedio, por rendimiento o porque interactúa con el sistema operativo.
Más adelante de la conversación Jesús Cea explica cómo ver si un módulo concreto está en C o en Python sin tener que ir al código fuente.
Rust: https://es.wikipedia.org/wiki/Rust_(lenguaje_de_programaci%C3%B3n).
PyOxidizer: https://github.com/indygreg/PyOxidizer.
Fragmentación. Jesús Cea estoy más centrado en la parte de C porque la mayor parte de los "core developers" no saben C. Añadir más lenguajes reduce el grupo de gente que puede mantener esas partes.
Portabilidad de C.
Bootstraping de un lenguaje con el propio lenguaje.
La dificultad para tener atributos opcionales. Algunas ideas.
attrs: https://www.attrs.org/en/stable/.
Usar valores "sentinel".
Debate sobre presentarse o no en tertulias abiertas, o tener la cámara apagada.
Va siendo necesario tener algun repositorio para que la gente de la tertulia pueda compartir cosas.
La maldición de lo básico e "introducción a". Igual para que haya conversación interesante, hay que hacer preguntas interesantes :-).
Python-Madrid antes de que llegase Meetup.
Jesús Cea sugiere listas como "python-ideas": https://mail.python.org/mailman3/lists/python-ideas.python.org/. También la lista de programación Python en español: python-es@python.org.
Javier tiene intereses muy extraños :-).
En lo que sigue, cuando se habla de CPython, se refiere al intérprete de referencia de Python, que está escrito en lenguaje C: https://www.python.org/downloads/.
Participantes:
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Javier, conectando desde Madrid.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
__set_name__(). PEP 487:
https://www.python.org/dev/peps/pep-0487/.Poder "echar atrás" fácil.
Acumular cambios pendientes es deuda técnica.
auditwheel: https://pypi.org/project/auditwheel/.
¿Generación de Wheels en Microsoft Windows?
Se puede usar la opción -use-deprecated=legacy-resolver.
Esa opción se puede meter también en el fichero de configuración, para no tener que escribirlo en cada invocación.
Jesús Cea comete el pecado de meter paquetes Python en el sistema operativo.
Jesús lleva dos años dándole vueltas a esto: bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.
Explicación detallada del asunto.
Brainstorming.
Contador de referencias. Inmediato, pero no recoge ciclos.
Si se crean instancias y no se destruyen, se llama a un recolector "pesado" que también recoge ciclos.
Esto puede ser problemático al arrancar el programa, antes de que la creación/destrucción de objetos se "estabilice".
gc.disable():
https://docs.python.org/3/library/gc.html#gc.disable.
Jesús Cea "abusa" de los destructores y de que se ejecuten cuando él quiere. Lo práctico contra lo puro.
Jesús ofrece cervezas.
gc.collect():
https://docs.python.org/3/library/gc.html#gc.collect. Esto
sirve tanto para recoger los ciclos como para comprobar si
tu programa tiene ciclos de memoria o no.
Futures: https://docs.python.org/3/library/concurrent.futures.html.
Explorar un programa en producción.
Tracemalloc: https://docs.python.org/3/library/tracemalloc.html.
DTrace: http://dtrace.org/blogs/about/.
py-spy: https://pypi.org/project/py-spy/.
Pérdidas de memoria: Recordar lo hablado ya en tertulias anteriores.
jemalloc: http://jemalloc.net/.
MALLOC_PERTURB_:
https://debarshiray.wordpress.com/2016/04/09/malloc_perturb_/.
ESP8266: https://en.wikipedia.org/wiki/ESP8266.
Bluetooth Low Energy: https://en.wikipedia.org/wiki/Bluetooth_Low_Energy.
¿Qué ventajas aporta usar Micropython?
Desperdicio de recursos materiales porque realmente sobran.
Python es mucho más lento que C y no digamos ensamblador.
Subinterpreters: PEP 554: https://www.python.org/dev/peps/pep-0554/.
Si los subintérpretes no compartiesen NADA, se podrían lanzar simultaneamente en varios núcleos de la CPU sin competir por un GIL https://en.wikipedia.org/wiki/Global_interpreter_lock único.
JIT: https://es.wikipedia.org/wiki/Compilaci%C3%B3n_en_tiempo_de_ejecuci%C3%B3n.
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 los programas no lo son. Jesús pone varios ejemplos.
Conversación densa entre Jesús y Javier.
Guardas para comprobar que la especialización sigue siendo correcta. Por ejemplo, para los diccionarios: PEP 509 Add a private version to dict: https://www.python.org/dev/peps/pep-0509/
"Tipado" más estricto.
MYPY: http://mypy-lang.org/.
Pydantic: https://pydantic-docs.helpmanual.io/.
Comprobación de tipos en tiempo de ejecución.
Descubrimiento de tipos en tiempo de ejecución, proporcionando "especialización".
Eduardo Castro entra y simplifica la discusión.
Jesús explica qué hace "a+b" internamente.
Memoria transaccional: https://es.wikipedia.org/wiki/Memoria_transaccional.
(nota de Jesús Cea): Los sistemas de persistencia Python descritos en tertulias anteriores pueden considerarse casos de memoria transaccional... si somos flexibles.
"Colorear" objetos y que dos hilos no puedan acceder a objetos del mismo color simultaneamente o en transacciones concurrentes.
Jesús Cea lo ha intentado y se ha rendido.
Poder usar todos los núcleos de la CPU.
Dadle una pesada al bug bpo35930: "Raising an exception raised in a "future" instance will create reference cycles": https://bugs.python.org/issue35930.
En esta ocasión grabamos un miércoles porque ayer fue festivo en España.
Participantes:
Eduardo Castro, email: info@ecdesign.es. Conectando desde A Guarda.
Jesús Cea, email: jcea@jcea.es, twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid.
Miguel Sánchez, email: msanchez@uninet.edu, conectando desde Canarias.
Víctor Ramírez, twitter: @virako, programador python y amante de vim, conectando desde Huelva.
Artur, conectando desde Vigo.
Audio editado por Pablo Gómez, twitter: @julebek.
La música de la entrada y la salida es "Lightning Bugs", de Jason Shaw. Publicada en https://audionautix.com/ con licencia - Creative Commons Attribution 4.0 International License.
Referencia a un mensaje enviado a la lista de correo.
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 múltiples hilos.
Py_FileSystemDefaultEncodeErrors and Py_UTF8Mode are not available with limited API: https://bugs.python.org/issue41986.
La idea es buena, pero la implementación es chapucera y poco transparente.
Es muy difícil combinar los mundos síncronos y asíncronos. Las librerías tienen que tomar partido.
El código asíncrono "contamina" todo el programa.
Las distribuciones no están a la última. Cada cliente tiene instalado algo distinto.
Utilizar cosas como Docker https://es.wikipedia.org/wiki/Docker, para independizarte de la versión orifial del Sistema Operativo.
Los tests te salvan el día a la hora de actualizar de versión.
Hypothesis: https://pypi.org/project/hypothesis/.
Prueba de mutación: https://es.wikipedia.org/wiki/Prueba_de_mutaci%C3%B3n.
Python Bytes https://pythonbytes.fm/.
Seis temas, media hora. Semanal.
Opinión con criterio.
Podcast de testing: Test & Code https://testandcode.com/.
No suele haber problemas de compatibilidad actualizando a versiones más modernas de Python 3, y los cambios necesarios -si los hay- son menores.
Problema: Los paquetes precompilados de librerías complejas pueden tardar en estar disponible para la nueva versión de Python.
Muchas librerías complejas no publican versiones precompiladas de forma retroactiva para las versiones nuevas de Python cuando salen, hay que esperar a que saquen una nueva versión de la librería, a veces meses después.
Si tardas en actualizar, actualizar múltiples versiones de golpe puede ser muy costoso.
Se puede usar la opción -use-deprecated=legacy-resolver.
Librerías compatibles con versiones nuevas de Python, pero que PIP no quiere instalar porque en los descriptores del proyecto no dice que sea compatible. Esto es un problema cuando sale una versión nueva de Python.
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/.
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 de esto en una tertulia anterior.
Tema abordado de forma extensa en la tertulia anterior: https://podcast.jcea.es/python/9. Revisa el audio y/o las notas de esa grabación.
Trabajando con persistencia, no puedes traerte tus ideas de teoría relacional. Se trabaja de otra manera.
Acceso al sistema de persistencia a través de un API.
¿Cómo se actualiza la definición de objetos? Jesús describe las dos técnicas que usa:
Versión global de la base de datos con actualización en el arranque.
Cada objeto tiene su versión y se actualiza al cargarlo en memoria.
Los objetos son objetos nativos de Python. Para que otros lenguajes puedan acceder a los datos hay que proporcionarles un API.
Event Sourcing https://dev.to/barryosull/event-sourcing-what-it-is-and-why-its-awesome.
Lenguaje Linda https://en.wikipedia.org/wiki/Linda_(coordination_language).
RabbitMQ: https://www.rabbitmq.com/.
ZeroMQ: https://zeromq.org/.
Redis: https://redis.io/.
Colas persistentes.
BerkeleyDB: https://en.wikipedia.org/wiki/BerkeleyDB.
Github: https://github.com/.