Python 3.9

Python 3.9.0 (final) se publicó el 5 de octubre de 2020. Las características de 3.9 se definen en PEP 596 y una descripción detallada de los cambios se puede encontrar en Novedades de Python 3.9

Características

Estado

PEP 573

Acceso rápido al estado del módulo desde métodos de tipos de extensión en C

No relevante

PEP 584

Operadores de unión añadidos a dict

Completo [1]

PEP 585

Sugerencias de tipo genéricas en colecciones estándar

PEP 593

Anotaciones flexibles de funciones y variables

PEP 602

CPython adopta un ciclo de lanzamiento anual. En lugar de anual, apunta a un ciclo de lanzamiento de dos meses

No relevante

PEP 614

Restricciones gramaticales relajadas en los decoradores

PEP 615

La base de datos de zonas horarias de la IANA ahora está presente en la biblioteca estándar en el módulo zoneinfo

PEP 616

Métodos de cadena para eliminar prefijos y sufijos

PEP 617

CPython ahora usa un nuevo analizador basado en PEG

No relevante

Otros cambios del lenguaje:

__import__() ahora lanza ImportError en lugar de ValueError

Completo

Python ahora obtiene la ruta absoluta del nombre de archivo del script especificado en la línea de comandos (ej.: python3 script.py): el atributo __file__ del módulo __main__ pasó a ser una ruta absoluta, en lugar de una ruta relativa

Por defecto, para obtener el mejor rendimiento, el argumento errors solo se comprueba en el primer error de codificación/decodificación, y el argumento encoding a veces se ignora para cadenas vacías

«».replace(«», s, n) ahora devuelve s en lugar de una cadena vacía para todo n distinto de cero. Ahora es coherente con «».replace(«», s)

Cualquier expresión válida ahora se puede usar como decorador. Anteriormente, la gramática era mucho más restrictiva

La ejecución en paralelo de aclose() / asend() / athrow() ahora está prohibida, y ag_running ahora refleja el estado real de ejecución del generador asíncrono

Los errores inesperados al llamar al método __iter__ ya no quedan enmascarados por TypeError en el operador in y en las funciones contains(), indexOf() y countOf() del módulo operator

Las expresiones lambda sin paréntesis ya no pueden ser la parte de expresión en una cláusula if dentro de comprensiones y expresiones generadoras

Cambios en los módulos integrados:

asyncio

Debido a importantes preocupaciones de seguridad, el parámetro reuse_address de asyncio.loop.create_datagram_endpoint() ya no es compatible

Se añadió una nueva corrutina shutdown_default_executor() que programa un apagado del ejecutor predeterminado, esperando a que el ThreadPoolExecutor termine de cerrarse. Además, asyncio.run() se ha actualizado para usar la nueva corrutina.

Se añadió asyncio.PidfdChildWatcher, una implementación de vigilante de procesos hijos específica de Linux que sondea descriptores de archivo de procesos

se añadió una nueva coroutine asyncio.to_thread()

Al cancelar la tarea debido a un tiempo de espera, asyncio.wait_for() ahora esperará hasta que la cancelación se complete también en el caso de que el tiempo de espera sea <= 0, igual que hace con tiempos de espera positivos

asyncio ahora lanza TyperError al llamar a métodos incompatibles con un socket ssl.SSLSocket

gc

La recolección de basura ya no se bloquea con objetos resucitados

Se añadió una nueva función gc.is_finalized() para comprobar si un objeto ha sido finalizado por el recolector de basura

math

Se amplió la función math.gcd() para manejar múltiples argumentos. Anteriormente, solo admitía dos argumentos

Se añadió math.lcm(): devuelve el mínimo común múltiplo de los argumentos especificados

Se añadió math.nextafter(): devuelve el siguiente valor de coma flotante después de x en dirección a y

Se añadió math.ulp(): devuelve el valor del bit menos significativo de un float

os

Se expusieron os.pidfd_open() y os.P_PIDFD, específicos de Linux

La función os.unsetenv() ahora también está disponible en Windows

Completo

Las funciones os.putenv() y os.unsetenv() ahora están siempre disponibles

Completo

Se añadió la función os.waitstatus_to_exitcode(): convierte un estado de espera en un código de salida

random

Se añadió un nuevo método random.Random.randbytes: genera bytes aleatorios

sys

Se añadió un nuevo atributo sys.platlibdir: nombre del directorio de bibliotecas específico de la plataforma

Anteriormente, sys.stderr usaba búfer por bloques cuando no era interactivo. Ahora stderr usa por defecto siempre búfer por líneas

Notas