Python 3.8

Python 3.8.0 (final) se publicó el 14 de octubre de 2019. Las características de 3.8 se definen en PEP 569 y una descripción detallada de los cambios se puede encontrar en Novedades de Python 3.8.

Características

Estado

PEP 570

Argumentos solo posicionales

PEP 572

Expresiones de asignación

Completo

PEP 574

Protocolo pickle 5 con datos fuera de banda

PEP 578

Ganchos de auditoría en tiempo de ejecución

PEP 587

Configuración de inicialización de Python

PEP 590

Vectorcall: un protocolo de llamada rápido para CPython

Varios

Las f-strings admiten = para expresiones autodocumentadas y depuración

Completo

Otros cambios del lenguaje:

Una sentencia continue era ilegal en la cláusula finally debido a un problema con la implementación. En Python 3.8 se eliminó esta restricción

Completo

Los tipos bool, int y fractions.Fraction ahora tienen un método as_integer_ratio() como el que se encuentra en float y decimal.Decimal

Los constructores de int, float y complex ahora usarán el método especial __index__(), si está disponible y el método correspondiente __int__(), __float__() o __complex__() no lo está

Se añadió soporte para escapes N{name} en expresiones regulares

Los dict y las dictviews ahora son iterables en orden de inserción inverso usando reversed()

Se restringió aún más la sintaxis permitida para los nombres de palabra clave en las llamadas a funciones. En particular, f((keyword)=arg) ya no está permitido

El desempaquetado generalizado de iterables en las sentencias yield y return ya no requiere paréntesis envolventes

Cuando falta una coma en código como [(10, 20) (30, 40)], el compilador muestra un SyntaxWarning con una sugerencia útil

Las operaciones aritméticas entre subclases de datetime.date o datetime.datetime y objetos datetime.timedelta ahora devuelven una instancia de la subclase, en lugar de la clase base

Cuando el intérprete de Python es interrumpido por Ctrl-C (SIGINT) y la excepción KeyboardInterrupt resultante no se captura, el proceso de Python ahora sale mediante una señal SIGINT o con el código de salida correcto, de modo que el proceso que lo invoca pueda detectar que terminó debido a un Ctrl-C

Algunos estilos avanzados de programación requieren actualizar el objeto types.CodeType de una función existente

Para los enteros, la forma de tres argumentos de la función pow() ahora permite que el exponente sea negativo en el caso en que la base sea relativamente prima respecto al módulo

Las comprensiones de dict se han sincronizado con los literales de dict, de modo que la clave se calcula primero y el valor después

El método object.__reduce__() ahora puede devolver una tupla de entre dos y seis elementos de longitud

Cambios en los módulos integrados:

asyncio

asyncio.run() ha pasado de la API provisional a la estable

Completo

Ejecutar python -m asyncio lanza un REPL asíncrono de forma nativa

La excepción asyncio.CancelledError ahora hereda de BaseException en lugar de Exception y ya no hereda de concurrent.futures.CancelledError

Completo

Se añadió asyncio.Task.get_coro() para obtener la corrutina envuelta dentro de una asyncio.Task

Las tareas de asyncio ahora se pueden nombrar, ya sea pasando el argumento de palabra clave name a asyncio.create_task() o al método create_task() del bucle de eventos, o llamando al método set_name() en el objeto de tarea

Se añadió soporte para Happy Eyeballs en asyncio.loop.create_connection(). Para especificar el comportamiento, se han añadido dos nuevos parámetros: happy_eyeballs_delay e interleave.

gc

get_objects() ahora puede recibir un parámetro opcional generation que indica una generación de la que obtener objetos. (Tenga en cuenta, sin embargo, que aunque gc es integrado, get_objects() no está implementado en MicroPython)

math

Se añadió la nueva función math.dist() para calcular la distancia euclidiana entre dos puntos

Se amplió la función math.hypot() para manejar múltiples dimensiones

Se añadió la nueva función math.prod(), análoga a sum(), que devuelve el producto de un valor «start» (por defecto: 1) por un iterable de números

Se añadieron dos nuevas funciones combinatorias math.perm() y math.comb()

Se añadió una nueva función math.isqrt() para calcular raíces cuadradas enteras precisas sin conversión a coma flotante

La función math.factorial() ya no acepta argumentos que no sean similares a enteros

Completo

sys

Se añadió la nueva función sys.unraisablehook(), que se puede sobrescribir para controlar cómo se manejan las «excepciones no lanzables»