En esta semana han ocurrido varias cosas en relación a  python su lanzamiento saturó internet dejando inaccesible a tres de las principales redes sociales.. bueno eso no es verdad pero hay un hecho que sí es cierto y es que python este lunes oficialmente salió su release 3.10 Ver Figura 1 para uso de la comunidad y trae consigo grandes features, en este artículo me centraré en hablar del cambio relacionado con el manejo de errores

Figura 1: Tweet notificación del lanzamiento de python 3.10

Pyenv

Antes de iniciar, para poder instalar python 3.10 de manera sencilla y para no ir a generar un caos en su SO recomendare la siguiente herramienta llamada pyenv, si han trabajando en node sería el equivalente a nvm el cual facilmente permite instalar python 3.10, para instalarlo en linux

curl -L https://github.com/pyenv/pyenv-installer/raw/master/bin/pyenv-installer | bash

para instalar python 3.10 simplemente ejecutamos el siguiente comando

pyenv install 3.10.0

para ver las versiones instaladas

pyenv --versions

por defecto estará seleccionada python 3.10 y con esta herramienta ya pueden empezar a probar el nuevo release sin generar problemas con las demás versiones

Errores en python < 3.10

En el tratamiento de errores en la versiones de python inferiores a la 3.10 tenemos algunos pequeños problemitas de hecho uno de los autores de uno de los libros más leídos sobre python dio su visto bueno sobre este cambio  Ver Figura 2

Figura 2: Opinión de David Beazley sobre los mensajes de error en python 3.10

y claro como no si el siguiente error es muy común encontrarlo

SyntaxError: unexpected EOF while parsing

un ejemplo de error en la sintaxis visto en la versión 3.9 vs la versión 3.10 con el mismo código

def show(data:dict):
    print(data)


show({"age":20"name":"Jhon"})

ejecuto con python 3.9 y luego con python 3.10

 File "main.py", line 6
    show({"age":20"name":"Jhon"})
                  ^
SyntaxError: invalid syntax
Resultado en python 3.9
File "main.py", line 6
    show({"age":20"name":"Jhon"})
                ^^^^^^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Resultado en python 3.10

El cambio es bastante impactante debido a que en el segundo resultado se tiene una sugerencia lo cual es una gran ayuda tanto para los que inician en python como para las personas que deben revisar logs, la verdad es que el  'Did you mean' me ha encantado, veamos otro ejemplo

class Helper:
    @staticmetho
    def get_base_url():
        return "https://jairoandres.com"

ejecuto el codigo con python 3.9 y luego python 3.10 y este es el resultado

Traceback (most recent call last):
  File "main.py", line 5, in <module>
    class Helper:
  File "main.py", line 6, in Helper
    @staticmetho
NameError: name 'staticmetho' is not defined
Resultado en python 3.9
Traceback (most recent call last):
  File "main.py", line 5, in <module>
    class Helper:
  File "main.py", line 6, in Helper
    @staticmetho
NameError: name 'staticmetho' is not defined. Did you mean: 'staticmethod'?
Resultado en python 3.10

También funciona con clases


class Person:

    def __init__(self, name:str, age:int) -> None:
        self.name = name 
        self.age = age 
        

person = Person("Jhon",25)
print(person.ag)

ejecuto en python 3.9 y python 3.10

Traceback (most recent call last):
  File "main.py", line 21, in <module>
    print(person.ag)
AttributeError: 'Person' object has no attribute 'ag'
Resultado en python 3.9
Traceback (most recent call last):
  File "main.py", line 21, in <module>
    print(person.ag)
AttributeError: 'Person' object has no attribute 'ag'. Did you mean: 'age'?
Resultado en python 3.10

los errores sintácticos en python no son muy amigables de corregir, como todo programador o programadora la primera acción que hacen es acudir a google y generalmente esto nos lleva a stackoverflow, este error es muy genérico, si se lleva algún tiempo ya trabajando con python se podría deducir un error de sintaxis, pero el debug para encontrar dónde está el error en proyectos grandes se vuelve tedioso, por ello se agregó esta mejora que se aprecia a continuación

person = {"age":20,"name":"Jhon"

Ejecutó en python 3.9 y python 3.10

  File "main.py", line 24
    
    ^
SyntaxError: unexpected EOF while parsing
Resultado en python 3.9
File "main.py", line 22
    person = {"age":20,"name":"Jhon"
             ^
SyntaxError: '{' was never closed
Resultado en python 3.10

para finalizar podemos ver como funciona también con módulos de python que puede ser una gran ayuda ya que incluso muchas veces los editores no se configuran para acceder a los entornos virtuales lo que no permite saber que librerias estan instaladas

from datetime import date

print(data.now())

se ejecuta con python 3.9 y python 3.10

Traceback (most recent call last):
  File "moduleerror.py", line 3, in <module>
    print(data.now())
NameError: name 'data' is not defined. Did you mean: 'date'?
Resultado en python 3.9
Traceback (most recent call last):
  File "moduleerror.py", line 3, in <module>
    print(data.now())
NameError: name 'data' is not defined
Resultado en python 3.10

Aprovechar Generando informes

Eventualmente se podrá capturar errores utilizando python 3.10 y generando html con estos errores, por ejemplo la librería rich  permite generar html a partir de errores tipo informes como se aprecia a continuación

from rich.console import Console
from main import Person
console = Console(record=True)

def save_html(html_doc:str):
    with open("error.html", mode="w") as file:
        file.write(html_doc)

def generate_error():
    try:
        person = Person("Jhon", 25)
        console.print(person.ag)
    except Exception:
        console.print_exception(show_locals=True)
        html_doc = console.export_html()
        save_html(html_doc)


generate_error()

el html generado se aprecia a continuación

Figura 3: Html generado a partir de rich con python 3.9

eventualmente con python 3.10 se podría generar un mejor informe más o menos como el siguiente ejemplo modificado

Figura 4: Ejemplo modificado de rich export html en python

Conclusiones

Los errores juegan un papel fundamental a lo largo de un ciclo de vida del desarrollo de software, cuando se está en ambientes devs estos nuevos mensajes ayudarán a mejorar el debug sumado con el typing seguro los tiempos se reducirán bastante, es importante esperar aún hasta que se estabilice las librerias y demas tools con la nueva versión antes de lanzarse al cambio de python 3.10, otra características que realmente me ha gustado es el pattern matching pero ese será para hablarlo en otro post