Anotaciones de tipos: ¿Son pythónicas? También versiones de paquetes y grafos de dependencias https://podcast.jcea.es/python/18
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/.
https://docs.python.org/3/library/pickle.html en el módulo
__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.
solucionarse. Queja productiva.
https://github.com/mypyc/mypyc, que aprovechan Python 3.9.
Sigue fallando mucho.
meter anotaciones de tipos de forma automática.
equipos grandes.
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.
tipos. Podría ser mucho más inteligente.
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).
alguno en el intérprete normal de Python?
Complejidad y compatibilidad.
Faltan manos.
Hay muchos "gérmenes" que no germinan.
Dispersión de esfuerzos.
otros lenguajes:
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.
barrera de entrada si conoces esa cultura.
La cultura va evolucionando.
Solución de compromiso: Meter tipos solo en la frontera.
al importar el código en una versión anterior de Python.
comprehension":
>>> [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().
usar un 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.
despliegue.
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.
exige y qué paquetes dependen de él?
pip show.
Grafo de dependencias "pip-tree": https://pypi.org/project/pip-tree/.
control de versiones moderno. Por ejemplo con Mercurial: "hg" https://www.mercurial-scm.org/.
glog
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.
https://realpython.com/products/cpython-internals-book/.
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.
Lightweight Web Scraper for Python"
https://pypi.org/project/autoscraper/. Búsquedas "borrosas".
https://pypi.org/project/graphviz/.
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.
caracteres extraños? ¡Problema de seguridad!
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.
mismo, 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.
al principio de los tiempos para conducir un coche tenías
que ser mecánico, pero ya no.
Falta toda la base, pero... ¿Hace falta?