Eduardo Castro se desata y nos invita a comentar trucos y construcciones idiomáticas no evidentes
Autor: Jesús Cea & Otros - Contacto: python2021@podcast.jcea.es
Fecha de grabación: 2021/01/26 - Duración: 02:13:45
Fecha de publicación: 2021/05/18
Palabras clave: Tertulia
Descarga el audio: M4A (32309593 bytes) - OPUS (17119938 bytes)
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.