Python 3.10

Python 3.10.0 (final) se lanzó el 4 de octubre de 2021. Las características de la versión 3.10 se definen en PEP 619 y una descripción detallada de los cambios se puede encontrar en Novedades de Python 3.10.

Nuevas características de sintaxis

Estado

PEP 634

Coincidencia estructural de patrones: Especificación

[1]

PEP 635

Coincidencia estructural de patrones: Motivación y fundamentos

[1]

PEP 636

Coincidencia estructural de patrones: Tutorial

[1]

bpo-12782

Los administradores de contexto entre paréntesis ahora están oficialmente permitidos

Nuevas características en la biblioteca estándar

PEP 618

Añadir comprobación opcional de longitud a zip

Mejoras del intérprete

PEP 626

Números de línea precisos para depuración y otras herramientas

Nuevas características de tipado

PEP 604

Permitir escribir tipos de unión como X | Y

PEP 613

Alias de tipo explícitos

PEP 612

Variables de especificación de parámetros

Obsolescencias, eliminaciones o restricciones importantes

PEP 644

Requerir OpenSSL 1.1.1 o más reciente

PEP 632

Marcar como obsoleto el módulo distutils.

No relevante

PEP 623

Marcar como obsoleto y preparar la eliminación del miembro wstr en PyUnicodeObject.

No relevante

PEP 624

Eliminar las API del codificador Py_UNICODE

No relevante

PEP 597

Añadir EncodingWarning opcional

Otros cambios del lenguaje:

El tipo int tiene un nuevo método int.bit_count(), que devuelve el número de unos en la expansión binaria de un entero dado, también conocido como recuento de población.

Las vistas devueltas por dict.keys(), dict.values() y dict.items() ahora tienen todas un atributo mapping que proporciona un objeto types.MappingProxyType que envuelve el diccionario original.

PEP 618: La función zip() ahora tiene una bandera opcional strict, utilizada para exigir que todos los iterables tengan la misma longitud.

Las funciones integradas y de extensión que toman argumentos enteros ya no aceptan Decimals, Fractions ni otros objetos que solo pueden convertirse en enteros con pérdida (por ejemplo, que tienen el método __int__() pero no el método __index__()).

Si object.__ipow__() devuelve NotImplemented, el operador recurrirá correctamente a object.__pow__() y object.__rpow__() como se espera.

Las expresiones de asignación ahora se pueden usar sin paréntesis dentro de literales de conjuntos y comprensiones de conjuntos, así como en índices de secuencias (pero no en rebanadas).

Las funciones tienen un nuevo atributo __builtins__ que se utiliza para buscar símbolos integrados cuando se ejecuta una función, en lugar de buscar en __globals__['__builtins__']. El atributo se inicializa a partir de __globals__["__builtins__"] si existe, de lo contrario a partir de los integrados actuales.

Se han añadido dos nuevas funciones integradas – aiter() y anext() – para proporcionar contrapartes asíncronas de iter() y next(), respectivamente.

Los métodos estáticos (@staticmethod) y los métodos de clase (@classmethod) ahora heredan los atributos del método (__module__, __name__, __qualname__, __doc__, __annotations__) y tienen un nuevo atributo __wrapped__. Además, los métodos estáticos ahora se pueden llamar como funciones normales.

Las anotaciones para destinos complejos (todo lo que no sean destinos de simple name definidos por PEP 526) ya no provocan ningún efecto en tiempo de ejecución con from __future__ import annotations.

Los objetos de clase y de módulo ahora crean de forma diferida diccionarios de anotaciones vacíos bajo demanda. Los diccionarios de anotaciones se almacenan en el __dict__ del objeto por compatibilidad con versiones anteriores. Esto mejora las buenas prácticas para trabajar con __annotations__.

Las anotaciones que constan de yield, yield from, await o expresiones con nombre ahora están prohibidas bajo from __future__ import annotations debido a sus efectos secundarios.

El uso de variables no vinculadas, super() y otras expresiones que podrían alterar el procesamiento de la tabla de símbolos como anotaciones ahora quedan sin efecto bajo from __future__ import annotations.

Los hashes de los valores NaN tanto del tipo float como del tipo decimal.Decimal ahora dependen de la identidad del objeto. Anteriormente, siempre se calculaban como 0 aunque los valores NaN no son iguales entre sí. Esto causaba un comportamiento de tiempo de ejecución potencialmente cuadrático debido a colisiones excesivas de hash al crear diccionarios y conjuntos que contienen múltiples NaN.

Se lanzará un SyntaxError (en lugar de un NameError) al eliminar la constante __debug__.

Las excepciones SyntaxError ahora tienen atributos end_lineno y end_offset. Serán None si no se determinan.

Cambios en los módulos integrados:

asyncio

Añadir el método faltante connect_accepted_socket().

array

El método index() de array.array ahora tiene parámetros opcionales start y stop.

gc

Añadir ganchos de auditoría para gc.get_objects(), gc.get_referrers() y gc.get_referents().

hashlib

El módulo hashlib requiere OpenSSL 1.1.1 o más reciente.

El módulo hashlib tiene soporte preliminar para OpenSSL 3.0.0.

La implementación de reserva en Python puro de pbkdf2_hmac() está obsoleta. En el futuro, PBKDF2-HMAC solo estará disponible cuando Python se haya compilado con soporte para OpenSSL.

os

Añadir soporte para os.cpu_count() en el RTOS VxWorks.

Añadir una nueva función os.eventfd() y ayudantes relacionados para envolver la llamada al sistema eventfd2 en Linux.

Añadir os.splice() que permite mover datos entre dos descriptores de archivo sin copiar entre el espacio de direcciones del kernel y el espacio de direcciones del usuario, donde uno de los descriptores de archivo debe referirse a una tubería.

Añadir O_EVTONLY, O_FSYNC, O_SYMLINK y O_NOFOLLOW_ANY para macOS.

platform

Añadir platform.freedesktop_os_release() para recuperar la identificación del sistema operativo del archivo estándar freedesktop.org os-release.

socket

La excepción socket.timeout ahora es un alias de TimeoutError.

Añadir la opción de crear sockets MPTCP con IPPROTO_MPTCP.

Añadir la opción IP_RECVTOS para recibir el tipo de servicio (ToS) o los campos DSCP/ECN.

ssl

El módulo ssl requiere OpenSSL 1.1.1 o más reciente.

El módulo ssl tiene soporte preliminar para OpenSSL 3.0.0 y una nueva opción OP_IGNORE_UNEXPECTED_EOF.

Las funciones obsoletas y el uso de constantes obsoletas ahora resultan en un DeprecationWarning. ssl.SSLContext.options tiene OP_NO_SSLv2 y OP_NO_SSLv3 establecidos de forma predeterminada y, por lo tanto, no puede advertir sobre la activación de la bandera nuevamente.

El módulo ssl ahora tiene configuraciones predeterminadas más seguras. Los cifrados sin confidencialidad directa o con MAC SHA-1 están deshabilitados de forma predeterminada. El nivel de seguridad 2 prohíbe las claves RSA, DH y ECC débiles con menos de 112 bits de seguridad. SSLContext usa de forma predeterminada la versión mínima del protocolo TLS 1.2. Las configuraciones se basan en la investigación de Hynek Schlawack.

Los protocolos obsoletos SSL 3.0, TLS 1.0 y TLS 1.1 ya no son oficialmente compatibles. Python no los bloquea activamente. Sin embargo, las opciones de compilación de OpenSSL, las configuraciones de la distribución, los parches del proveedor y los conjuntos de cifrado pueden impedir un protocolo de enlace exitoso.

Añadir un parámetro timeout a la función ssl.get_server_certificate().

El módulo ssl utiliza tipos en el heap e inicialización multifase.

Se ha añadido una nueva bandera de verificación VERIFY_X509_PARTIAL_CHAIN.

sys

Añadir el atributo sys.orig_argv: la lista de los argumentos originales de la línea de comandos pasados al ejecutable de Python.

Añadir sys.stdlib_module_names, que contiene la lista de los nombres de los módulos de la biblioteca estándar.

_thread

_thread.interrupt_main() ahora toma un número de señal opcional para simular (el valor predeterminado sigue siendo signal.SIGINT).

Notas