Python en español #17: Tertulia 2021-01-26
Python en español - En podcast af Jesús Cea
Kategorier:
Eduardo Castro se desata y nos invita a comentar trucos y construcciones idiomáticas no evidentes https://podcast.jcea.es/python/17 Participantes: Jesús Cea, email: [email protected], twitter: @jcea, https://blog.jcea.es/, https://www.jcea.es/. Conectando desde Madrid. Eduardo Castro, email: [email protected]. 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: [email protected], 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. [00:52] Haciendo tiempo hasta que entre más gente. Raspberry Pi Pico: https://www.raspberrypi.org/products/raspberry-pi-pico/. Jesús Cea está encantado con su rango de alimentación. Micropython: https://www.micropython.org/. [06:02] Truco: 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. [11:17] Regresión con ipdb: https://pypi.org/project/ipdb/. [12:37] Nueva versión de Pyston https://www.pyston.org/. Intérprete de Python más rápido. Un 50% más rápido que cpython. [16:22] Ver si dos fechas son iguales con datetime https://docs.python.org/3/library/datetime.html. Trabajar siempre en UTC https://es.wikipedia.org/wiki/Tiempo_universal_coordinado, aunque solo tengas una zona horaria. [19:52] Jesús Cea ha investigado cómo funcionan los POSTs HTTP en las protecciones CSRF https://es.wikipedia.org/wiki/CSRF. 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. [24:32] ¿Optimizaciones cuando tienes grandes cantidades de datos? 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. [31:52] Gestión de memoria en Python. 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. [35:17] Tipografía para programadores: Victor Mono: https://rubjo.github.io/victor-mono/. Fira Code: https://fonts.google.com/specimen/Fira+Code. Fira Code Retina: https://github.com/tonsky/FiraCode/issues/872. [37:17] Eduardo Castro se ha currado una lista de trucos sencillos pero interesantes: 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. [43:02] LRU Caché: <https://docs.python.org/3/library/functools.html#functools.lru_cache. Bugs abundantes en LRU Cache y múltiples hilos: https://bugs.python.org/issue?%40columns=id%2Cactivity%2Ctitle%2Ccreator%2Cassignee%2Cstatus%2Ctype&%40sort=-activity&%40filter=status&%40action=searchid&ignore=file%3Acontent&%40search_text=lru_cache+threads&submit=search&status=-1%2C1%2C2%2C3. Yield: Ojo con excepciones y filtraciones de memoria. [48:37] Uso interesante con los "context managers": @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. [51:12] itertools: https://docs.python.org/3/library/itertools.html. A Jesús Cea no le entra en la cabeza la programación funcional. [56:02] ¿Qué es ser Pythonico? 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. La complejidad fragmenta los diferentes idiomas del lenguaje. [01:08:22] Seguimos desgranando los trucos propuestos por Eduardo. collections.defaultdict(): https://docs.python.org/3/library/collections.html#collections.defaultdict. [01:11:12] iter() y next() admiten una parametro extra centinela opcional que especifica un valor que termina el iterador. Utilizar objetos centinelas que no sean None, porque None puede ser un objeto válido. [01:17:32] Los "slices" son objetos que se pueden crear y utilizar: slice(1,100). Pasar un iterador a una función abre posibilidades interesantes. Slice Objects: https://docs.python.org/3/c-api/slice.html. [01:23:42] contextlib.suppress() https://docs.python.org/3/library/contextlib.html#contextlib.suppress. Hay que recordar que aunque la excepción se suprime, la ejecución del cuerpo se corta en ese punto. [01:24:47] pathlib: https://docs.python.org/3/library/pathlib.html. [01:25:12] Usos atípicos de else: if, for, try, while... https://docs.python.org/3/tutorial/controlflow.html#break-and-continue-statements-and-else-clauses-on-loops. https://docs.python.org/3/tutorial/errors.html#handling-exceptions. Teoría unificada sobre else en Python. [01:30:07] El orden de los except ... IMPORTA. [01:32:22] Tu yo del futuro tiene que tratar con tu yo del pasado. "Escribe código como si el siguiente que tuviera que trabajar con el fuese un psicópata asesino que sabe donde vives". Sistemas de control de versiones: "Annotate" -> "blame". [01:33:57] Usos de lambda. Módulo Operator: https://docs.python.org/3/library/operator.html. [01:35:52] Algunos trucos cortos adicionales. 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. [01:56:22] Python cada vez tiene más "gotchas". Algunos ejemplos: 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'). [02:01:06] ¡Terminamos con los trucos! [02:01:37] Ideas para indexar y buscar el documentos: Whoosh: https://whoosh.readthedocs.io/en/latest/intro.html. Solr: https://solr.apache.org/. [02:04:22] Deberes para el futuro: módulos dis https://docs.python.org/3/library/dis.html y enum https://docs.python.org/3/library/enum.html. [02:04:47] Sugerencia sobre visión artificial: https://www.pyimagesearch.com/. De lo mejor que hay. [02:06:47] regex https://pypi.org/project/regex/ que libera el GIL https://en.wikipedia.org/wiki/Global_interpreter_lock. [02:07:47] Acelerador y distribución de programas Python precompilados en binario y empaquetados en un directorio e, incluso, en un único fichero: Nuitka: https://nuitka.net/. [02:08:57] Design of CPython’s Garbage Collector: https://devguide.python.org/garbage_collector/. [02:09:17] Cierre. [02:10:52] Casi se nos olvida el aviso legal para grabar y publicar las sesiones. [02:12:55] Final.