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: 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.
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.
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.
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.
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.
<https://docs.python.org/3/library/functools.html#functools.lru_cache.
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.
https://docs.python.org/3/library/itertools.html. A Jesús
Cea no le entra en la cabeza la programación funcional.
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.
Eduardo.
collections.defaultdict():iter() y next() admiten una parametro extra
centinela opcional que especifica un valor que termina el
iterador.
None, porqueNone puede ser un objeto válido.
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.
contextlib.suppress()
https://docs.python.org/3/library/contextlib.html#contextlib.suppress.
https://docs.python.org/3/library/pathlib.html.
else: if, for, try,
while...
except ... IMPORTA.
pasado. "Escribe código como si el siguiente que tuviera que
trabajar con el fuese un psicópata asesino que sabe
donde vives".
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.
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').
dis
https://docs.python.org/3/library/dis.html y enum
https://docs.python.org/3/library/enum.html.
https://www.pyimagesearch.com/. De lo mejor que hay.
GIL https://en.wikipedia.org/wiki/Global_interpreter_lock.
precompilados en binario y empaquetados en un directorio e,
incluso, en un único fichero: Nuitka: https://nuitka.net/.
https://devguide.python.org/garbage_collector/.
publicar las sesiones.