# Novedades de Python 3.9

Liberación

  3.10.5

Fecha

  agosto 01, 2022

Editor

  Łukasz Langa

This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020.

Para obtener detalles completos, consulte el changelog.

Ver también

PEP 596 - Programa de lanzamiento de Python 3.9

## Resumen: aspectos destacados de la versión

Nuevas funciones de sintaxis:

- PEP 584, operadores unión agregados a `dict`;

- PEP 585, genéricos de sugerencia de tipo en colecciones estándar;

- PEP 614, restricciones gramaticales relajadas para los decoradores.

Nuevas funciones integradas:

- PEP 616, métodos de cadena para eliminar prefijos y sufijos.

Nuevas funciones en la biblioteca estándar:

- PEP 593, función flexible y anotaciones variables;

- Se agregó `os.pidfd_open()` que permite la gestión de procesos sin razas ni señales.

Mejoras en el intérprete:

- PEP 573, acceso rápido al estado del módulo desde métodos de tipos de extensión C;

- PEP 617, CPython ahora usa un nuevo analizador basado en PEG;

- varias incorporaciones de Python (rango, tupla, conjunto, conjunto frozenset, lista, dict) ahora se aceleran usando PEP 590 vectorcall;

- la recolección de basura no bloquea los objetos resucitados;

- varios módulos de Python (`_abc`, `audioop`, `_bz2`, `_codecs`, `_contextvars`, `_crypt`, `_functools`, `_json`, `_locale`, `math`, `operator`, `resource`, `time`, `_weakref`) ahora utilizan la inicialización multifase según lo definido por PEP 489;

- varios módulos de biblioteca estándar (`audioop`, `ast`, `grp`, `_hashlib`, `pwd`, `_posixsubprocess`, `random`, `select`, `struct`, `termios`, `zlib`) ahora utilizan la ABI estable definida por PEP 384.

Nuevos módulos de biblioteca:

- PEP 615, la base de datos de zona horaria de IANA ahora está presente en la biblioteca estándar en el módulo `zoneinfo`;

- ahora se proporciona una implementación de una especie de gráfico topológico en el nuevo módulo `graphlib`.

Cambios en el proceso de lanzamiento:

- PEP 602, CPython adopta un ciclo de lanzamiento anual.

## Debe verificar DeprecationWarning en su código

Cuando todavía se admitía Python 2.7, se conservaba una gran cantidad de funciones en Python 3 por compatibilidad con versiones anteriores de Python 2.7. Con el fin de la compatibilidad con Python 2, estas capas de compatibilidad con versiones anteriores se eliminaron o se eliminarán pronto. La mayoría de ellos emitió una advertencia `DeprecationWarning` durante varios años. Por ejemplo, usar `collections.Mapping` en lugar de `collections.abc.Mapping` emite un `DeprecationWarning` desde Python 3.3, lanzado en 2012.

Pruebe su aplicación con la opción de línea de comandos `-W` `default` para ver `DeprecationWarning` y `PendingDeprecationWarning`, o incluso con `-W` `error` para tratarlos como errores. Warnings Filter se puede utilizar para ignorar las advertencias del código de terceros.

Python 3.9 es la última versión que proporciona esas capas de compatibilidad con versiones anteriores de Python 2, para dar más tiempo a los mantenedores de proyectos de Python para organizar la eliminación del soporte de Python 2 y agregar soporte para Python 3.9.

Los alias de Abstract Base Classes en el módulo `collections`, como el alias de `collections.Mapping` de `collections.abc.Mapping`, se mantienen para una última versión por compatibilidad con versiones anteriores. Se eliminarán de Python 3.10.

De manera más general, intente ejecutar sus pruebas en el Python Development Mode, lo que ayuda a preparar su código para que sea compatible con la próxima versión de Python.

Nota: también se eliminaron varias obsoletas en esta versión de Python. Consulte la sección Remoto.

## Nuevas características

### Operadores de combinación y actualización de diccionarios

Los operadores de fusión (`|`) y actualización (`|=`) se han agregado a la clase `dict` incorporada. Estos complementan los métodos `dict.update` y `{**d1, **d2}` existentes para fusionar diccionarios.

Ejemplo:

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}
    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

Consulte PEP 584 para obtener una descripción completa. (Contribuido por Brandt Bucher en bpo-36144.)

### Nuevos métodos de cadena para eliminar prefijos y sufijos

Se han agregado `str.removeprefix(prefix)` y `str.removesuffix(suffix)` para eliminar fácilmente un prefijo o sufijo innecesario de una cadena. También se han agregado los métodos correspondientes `bytes`, `bytearray` y `collections.UserString`. Consulte PEP 616 para obtener una descripción completa. (Contribuido por Dennis Sweeney en bpo-39939.)

### Tipos genéricos de sugerencia en colecciones estándar

En las anotaciones de tipo, ahora puede usar tipos de colección integrados como `list` y `dict` como tipos genéricos en lugar de importar los tipos en mayúsculas correspondientes (por ejemplo, `List` o `Dict`) desde `typing`. Algunos otros tipos de la biblioteca estándar ahora también son genéricos, por ejemplo, `queue.Queue`.

Ejemplo:

    def greet_all(names: list[str]) -> None:
        for name in names:
            print("Hello", name)

Consulte PEP 585 para obtener más detalles. (Contribuido por Guido van Rossum, Ethan Smith y Batuhan Taşkaya en bpo-39481.)

### Nuevo analizador

Python 3.9 usa un nuevo analizador, basado en PEG en lugar de LL(1). El rendimiento del analizador nuevo es aproximadamente comparable al del analizador anterior, pero el formalismo PEG es más flexible que LL (1) cuando se trata de diseñar nuevas funciones de lenguaje. Comenzaremos a usar esta flexibilidad en Python 3.10 y versiones posteriores.

El módulo `ast` usa el nuevo analizador y produce el mismo AST que el analizador anterior.

En Python 3.10, el analizador anterior se eliminará y también lo hará toda la funcionalidad que depende de él (principalmente el módulo `parser`, que ha estado en desuso durante mucho tiempo). En Python 3.9 only, puede volver al analizador LL (1) utilizando un modificador de línea de comando (`-X oldparser`) o una variable de entorno (`PYTHONOLDPARSER=1`).

Consulte PEP 617 para obtener más detalles. (Contribuido por Guido van Rossum, Pablo Galindo y Lysandros Nikolaou en bpo-40334.)

## Otros cambios de idioma

- `__import__()` ahora lanza `ImportError` en lugar de `ValueError`, que solía ocurrir cuando una importación relativa pasaba de su paquete de nivel superior. (Contribuido por Ngalim Siregar en bpo-37444.)

- Python ahora obtiene la ruta absoluta del nombre de archivo del script especificado en la línea de comando (por ejemplo: `python3 script.py`): el módulo `` __file__`` attribute of the `__main__` se convirtió en una ruta absoluta, en lugar de una ruta relativa. Estas rutas ahora siguen siendo válidas después de que las tramas del módulo `os.chdir()`. Como efecto alterno, la traza también muestra la ruta absoluta para los marcos del módulo `__main__` en este caso. (Contribuido por Victor Stinner en bpo-20443.)

- En Python Development Mode y en debug build, los argumentos de encoding and errors ahora se comprueban para las operaciones de codificación y decodificación de cadenas. Ejemplos: `open()`, `str.encode()` y `bytes.decode()`.

  De forma predeterminada, para un mejor rendimiento, el argumento errors argument is only checked at the first encoding/decoding error and the encoding a veces se ignora para cadenas vacías. (Contribuido por Victor Stinner en bpo-37388.)

- `"".replace("", s, n)` ahora devuelve `s` en lugar de una cadena vacía para todos los `n` distintos de cero. Ahora es compatible con `"".replace("", s)`. Hay cambios similares para los objetos `bytes` y `bytearray`. (Contribuido por Serhiy Storchaka en bpo-28029.)

- Cualquier expresión válida ahora se puede utilizar como decorator. Anteriormente, la gramática era mucho más restrictiva. Consulte PEP 614 para obtener más detalles. (Contribuido por Brandt Bucher en bpo-39702.)

- Ayuda mejorada para el módulo `typing`. Las cadenas de documentos ahora se muestran para todas las formas especiales y alias genéricos especiales (como `Union` y `List`). El uso de `help()` con un alias genérico como `List[int]` mostrará la ayuda para el tipo concreto correspondiente (`list` en este caso). (Contribuido por Serhiy Storchaka en bpo-40257.)

- La ejecución en paralelo de `aclose()` / `asend()` / `athrow()` ahora está prohibida, y `ag_running` ahora refleja el estado de ejecución real del generador asíncrono. (Contribuido por Yury Selivanov en bpo-30773.)

- Los errores inesperados al llamar al método `__iter__` ya no están enmascarados por `TypeError` en el operador `in` y funciones `contains()`, `indexOf()` y `countOf()` del módulo `operator`. (Contribuido por Serhiy Storchaka en bpo-40824.)

- Las expresiones lambda sin paréntesis ya no pueden ser la parte de expresión en una cláusula `if` en comprensiones y expresiones generadoras. Consulte bpo-41848 y bpo-43755 para obtener más detalles.

## Nuevos módulos

### zoneinfo

El módulo `zoneinfo` brinda soporte para la base de datos de zona horaria de IANA a la biblioteca estándar. Agrega `zoneinfo.ZoneInfo`, una implementación de `datetime.tzinfo` concreta respaldada por los datos de la zona horaria del sistema.

Ejemplo:

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta

    >>> # Daylight saving time
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00
    >>> dt.tzname()
    'PDT'

    >>> # Standard time
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00
    >>> print(dt.tzname())
    PST

Como fuente de datos alternativa para las plataformas que no envían la base de datos de la IANA, el módulo `tzdata` se lanzó como un paquete propio, distribuido a través de PyPI y mantenido por el equipo central de CPython.

Ver también

PEP 615: compatibilidad con la base de datos de zona horaria de IANA en la biblioteca estándar

  PEP escrito e implementado por Paul Ganssle

### Graphlib

Se agregó un nuevo módulo, `graphlib`, que contiene la clase `graphlib.TopologicalSorter` para ofrecer funcionalidad para realizar la clasificación topológica de gráficos. (Contribuido por Pablo Galindo, Tim Peters y Larry Hastings en bpo-17005.)

## Módulos mejorados

### ast

Se agregó la opción indent a `dump()` que le permite producir una salida con sangría de varias líneas. (Contribuido por Serhiy Storchaka en bpo-37995.)

Se agregó `ast.unparse()` como una función en el módulo `ast` que se puede usar para descomprimir un objeto `ast.AST` y producir una cadena con código que produciría un objeto `ast.AST` equivalente cuando se analiza. (Contribuido por Pablo Galindo y Batuhan Taskaya en bpo-38870.)

Se agregaron cadenas de documentación a los nodos AST que contienen la firma ASDL utilizada para construir ese nodo. (Contribuido por Batuhan Taskaya en bpo-39638.)

### asyncio

Debido a importantes problemas de seguridad, el parámetro reuse_address de `asyncio.loop.create_datagram_endpoint()` ya no es compatible. Esto se debe al comportamiento de la opción de socket `SO_REUSEADDR` en UDP. Para obtener más detalles, consulte la documentación de `loop.create_datagram_endpoint()`. (Contribuido por Kyle Stanley, Antoine Pitrou y Yury Selivanov en bpo-37228.)

Se agregó un nuevo coroutine `shutdown_default_executor()` que programa un apagado para el ejecutor predeterminado que espera en el `ThreadPoolExecutor` para finalizar el cierre. Además, `asyncio.run()` se ha actualizado para utilizar el nuevo coroutine. (Contribuido por Kyle Stanley en bpo-34037.)

Se agregó `asyncio.PidfdChildWatcher`, una implementación de observador de niños específica de Linux que sondea los descriptores de archivos de proceso. (bpo-38692)

Se agregó un nuevo coroutine `asyncio.to_thread()`. Se utiliza principalmente para ejecutar funciones vinculadas a IO en un hilo separado para evitar bloquear el bucle de eventos, y esencialmente funciona como una versión de alto nivel de `run_in_executor()` que puede tomar directamente argumentos de palabras clave. (Contribuido por Kyle Stanley y Yury Selivanov en bpo-32309.)

Al cancelar la tarea debido a un tiempo de espera, `asyncio.wait_for()` ahora esperará hasta que se complete la cancelación también en el caso de que timeout sea <= 0, como ocurre con los tiempos de espera positivos. (Contribuido por Elvis Pranskevichus en bpo-32751.)

`asyncio` ahora lanza `TyperError` al llamar a métodos incompatibles con un socket `ssl.SSLSocket`. (Contribuido por Ido Michael en bpo-37404.)

### compilar todo

Se agregó una nueva posibilidad de usar enlaces duros para archivos `.pyc` duplicados: parámetro hardlink_dupes y opción de línea de comando –hardlink-dupes. (Contribuido por Lumír “Frenzy” Balhar en bpo-40495.)

Se agregaron nuevas opciones para la manipulación de rutas en los archivos `.pyc` resultantes: parámetros stripdir, prependdir, limit_sl_dest y opciones de línea de comando -s, -p, -e. Se agregó la posibilidad de especificar la opción para un nivel de optimización varias veces. (Contribuido por Lumír “Frenzy” Balhar en bpo-38112.)

### Futuros concurrentes

Se agregó un nuevo parámetro cancel_futures a `concurrent.futures.Executor.shutdown()` que cancela todos los futuros pendientes que no han comenzado a ejecutarse, en lugar de esperar a que se completen antes de apagar el ejecutor. (Contribuido por Kyle Stanley en bpo-39349.)

Se eliminaron los subprocesos del demonio de `ThreadPoolExecutor` y `ProcessPoolExecutor`. Esto mejora la compatibilidad con los subinterpretadores y la previsibilidad en sus procesos de cierre. (Contribuido por Kyle Stanley en bpo-39812.)

Los trabajadores en `ProcessPoolExecutor` ahora se generan a pedido, solo cuando no hay trabajadores inactivos disponibles para reutilizar. Esto optimiza la sobrecarga de inicio y reduce la cantidad de tiempo de CPU perdido para los trabajadores inactivos. (Contribuido por Kyle Stanley en bpo-39207.)

### maldiciones

Se agregaron funciones `curses.get_escdelay()`, `curses.set_escdelay()`, `curses.get_tabsize()` y `curses.set_tabsize()`. (Contribuido por Anthony Sottile en bpo-38312.)

### fecha y hora

Los métodos `isocalendar()` de `datetime.date` y `isocalendar()` de `datetime.datetime` ahora devuelven un `namedtuple()` en lugar de un `tuple`. (Contribuido por Dong-hee Na en bpo-24416.)

### distutils

El comando: command: upload ahora crea resúmenes de hash SHA2-256 y Blake2b-256. Omite MD5 en plataformas que bloquean el resumen de MD5. (Contribuido por Christian Heimes en bpo-40698.)

### fcntl

Se agregaron las constantes `F_OFD_GETLK`, `F_OFD_SETLK` y `F_OFD_SETLKW`. (Contribuido por Dong-hee Na en bpo-38602.)

### ftplib

`FTP` y `FTP_TLS` ahora lanzan un `ValueError` si el tiempo de espera dado para su constructor es cero para evitar la creación de un socket sin bloqueo. (Contribuido por Dong-hee Na en bpo-39259.)

### GC

Cuando el recolector de basura realiza una recolección en la que resucitan algunos objetos (se puede acceder a ellos desde fuera de los ciclos aislados después de que se hayan ejecutado los finalizadores), no bloquee la recolección de todos los objetos que aún no se pueden alcanzar. (Contribuido por Pablo Galindo y Tim Peters en bpo-38379.)

Se agregó una nueva función `gc.is_finalized()` para verificar si el recolector de basura ha finalizado un objeto. (Contribuido por Pablo Galindo en bpo-39322.)

### hashlib

El módulo `hashlib` ahora puede usar hashes SHA3 y SHAKE XOF de OpenSSL cuando esté disponible. (Contribuido por Christian Heimes en bpo-37630.)

Los módulos hash incorporados ahora pueden desactivarse con `./configure --without-builtin-hashlib-hashes` o activarse selectivamente con p. Ej. `./configure --with-builtin-hashlib-hashes=sha3,blake2` para forzar el uso de la implementación basada en OpenSSL. (Contribuido por Christian Heimes en bpo-40479)

### http

Los códigos de estado HTTP `103 EARLY_HINTS`, `418 IM_A_TEAPOT` y `425 TOO_EARLY` se agregan a `http.HTTPStatus`. (Contribuido por Dong-hee Na en bpo-39509 y Ross Rhodes en bpo-39507.)

### IDLE e idlelib

Opción agregada para apagar el cursor parpadeando. (Contribuido por Zackery Spytz en bpo-4603.)

La tecla Escape ahora cierra las ventanas de finalización IDLE. (Contribuido por Johnny Najera en bpo-38944.)

Se agregaron palabras clave a la lista de finalización del nombre del módulo. (Contribuido por Terry J. Reedy en bpo-37765.)

New in 3.9 maintenance releases

Make IDLE invoke `sys.excepthook()` (when started without “-n”). User hooks were previously ignored. (Contributed by Ken Hilton in bpo-43008.)

Los cambios anteriores se han actualizado a las versiones de mantenimiento 3.8.

Rearrange the settings dialog. Split the General tab into Windows and Shell/Ed tabs. Move help sources, which extend the Help menu, to the Extensions tab. Make space for new options and shorten the dialog. The latter makes the dialog better fit small screens. (Contributed by Terry Jan Reedy in bpo-40468.) Move the indent space setting from the Font tab to the new Windows tab. (Contributed by Mark Roseman and Terry Jan Reedy in bpo-33962.)

Apply syntax highlighting to .pyi files. (Contributed by Alex Waygood and Terry Jan Reedy in bpo-45447.)

### imaplib

`IMAP4` y `IMAP4_SSL` ahora tienen un parámetro timeout parameter for their constructors. También el método `open()` ahora tiene un parámetro opcional timeout con este cambio. Los métodos anulados de `IMAP4_SSL` y `IMAP4_stream` se aplicaron a este cambio. (Contribuido por Dong-hee Na en bpo-38615.)

Se agrega `imaplib.IMAP4.unselect()`. `imaplib.IMAP4.unselect()` libera los recursos del servidor asociados con el buzón de correo seleccionado y devuelve el servidor al estado autenticado. Este comando realiza las mismas acciones que `imaplib.IMAP4.close()`, excepto que ningún mensaje se elimina permanentemente del buzón de correo seleccionado actualmente. (Contribuido por Dong-hee Na en bpo-40375.)

### importlib

Para mejorar la coherencia con las declaraciones de importación, `importlib.util.resolve_name()` ahora lanza `ImportError` en lugar de `ValueError` para intentos de importación relativa no válidos. (Contribuido por Ngalim Siregar en bpo-37444.)

Los cargadores de importación que publican objetos de módulo inmutables ahora pueden publicar paquetes inmutables además de módulos individuales. (Contribuido por Dino Viehland en bpo-39336.)

Se agregó la función `importlib.resources.files()` con soporte para subdirectorios en los datos del paquete, compatible con el backport en `importlib_resources` versión 1.5. (Contribuido por Jason R. Coombs en bpo-39791.)

`importlib.metadata` actualizado de `importlib_metadata` versión 1.6.1.

### inspeccionar

`inspect.BoundArguments.arguments` se cambia de `OrderedDict` a dictado regular. (Contribuido por Inada Naoki en bpo-36350 y bpo-39775.)

### dirección IP

`ipaddress` ahora admite direcciones de ámbito IPv6 (dirección IPv6 con sufijo `%<scope_id>`).

Las direcciones IPv6 con alcance se pueden analizar mediante `ipaddress.IPv6Address`. Si está presente, la identificación de la zona del alcance está disponible a través del atributo `scope_id`. (Contribuido por Oleksandr Pavliuk en bpo-34788.)

A partir de Python 3.9.5, el módulo `ipaddress` ya no acepta ceros a la izquierda en cadenas de direcciones IPv4. (Contribuido por Christian Heimes en bpo-36384).

### Matemáticas

Se amplió la función `math.gcd()` para manejar múltiples argumentos. Anteriormente, solo respaldaba dos argumentos. (Contribuido por Serhiy Storchaka en bpo-39648.)

`math.lcm()` agregado: devuelve el mínimo común múltiplo de argumentos especificados. (Contribuido por Mark Dickinson, Ananthakrishnan y Serhiy Storchaka en bpo-39479 y bpo-39648.)

`math.nextafter()` agregado: devuelve el siguiente valor de punto flotante después de x towards y. (Contribuido por Victor Stinner en bpo-39288.)

`math.ulp()` agregado: devuelve el valor del bit menos significativo de un flotador. (Contribuido por Victor Stinner en bpo-39310.)

### multiprocesamiento

La clase `multiprocessing.SimpleQueue` tiene un nuevo método `close()` para cerrar explícitamente la cola. (Contribuido por Victor Stinner en bpo-30966.)

### nntplib

`NNTP` y `NNTP_SSL` ahora lanzan un `ValueError` si el tiempo de espera dado para su constructor es cero para evitar la creación de un socket sin bloqueo. (Contribuido por Dong-hee Na en bpo-39259.)

### os

Se agregaron `CLD_KILLED` y `CLD_STOPPED` para `si_code`. (Contribuido por Dong-hee Na en bpo-38493.)

Se expusieron los `os.pidfd_open()` (bpo-38692) y `os.P_PIDFD` (bpo-38713) específicos de Linux para la gestión de procesos con descriptores de archivos.

La función `os.unsetenv()` ahora también está disponible en Windows. (Contribuido por Victor Stinner en bpo-39413.)

Las funciones `os.putenv()` y `os.unsetenv()` ahora están siempre disponibles. (Contribuido por Victor Stinner en bpo-39395.)

Función `os.waitstatus_to_exitcode()` agregada: convierte un estado de espera en un código de salida. (Contribuido por Victor Stinner en bpo-40094.)

### Pathlib

Se agregó `pathlib.Path.readlink()` que actúa de manera similar a `os.readlink()`. (Contribuido por Girts Folkmanis en bpo-30618)

### pdb

En Windows, ahora `Pdb` es compatible con `~/.pdbrc`. (Contribuido por Tim Hopper y Dan Lidral-Porter en bpo-20523.)

### poplib

`POP3` y `POP3_SSL` ahora lanzan un `ValueError` si el tiempo de espera dado para su constructor es cero para evitar la creación de un socket sin bloqueo. (Contribuido por Dong-hee Na en bpo-39259.)

### pprint

`pprint` ahora puede imprimir `types.SimpleNamespace` de forma bonita. (Contribuido por Carl Bordum Hansen en bpo-37376.)

### Pydoc

La cadena de documentación ahora se muestra no solo para la clase, función, método, etc., sino para cualquier objeto que tenga su propio atributo `__doc__`. (Contribuido por Serhiy Storchaka en bpo-40257.)

### aleatorio

Se agregó un nuevo método `random.Random.randbytes`: generar bytes aleatorios. (Contribuido por Victor Stinner en bpo-40286.)

### señal

Expuso el `signal.pidfd_send_signal()` específico de Linux para enviar señales a un proceso utilizando un descriptor de archivo en lugar de un pid. (bpo-38712)

### smtplib

`SMTP` y `SMTP_SSL` ahora lanzan un `ValueError` si el tiempo de espera dado para su constructor es cero para evitar la creación de un socket sin bloqueo. (Contribuido por Dong-hee Na en bpo-39259.)

El constructor `LMTP` ahora tiene un parámetro timeout opcional. (Contribuido por Dong-hee Na en bpo-39329.)

### enchufe

El módulo `socket` ahora exporta la constante `CAN_RAW_JOIN_FILTERS` en Linux 4.1 y superior. (Contribuido por Stefan Tatschner y Zackery Spytz en bpo-25780.)

El módulo de socket ahora admite el protocolo `CAN_J1939` en plataformas que lo admiten. (Contribuido por Karl Ding en bpo-40291.)

El módulo de enchufe ahora tiene las funciones `socket.send_fds()` y `socket.recv_fds()`. (Contribuido por Joannah Nanjekye, Shinya Okano y Victor Stinner en bpo-28724.)

### tiempo

En AIX, `thread_time()` ahora se implementa con `thread_cputime()` que tiene una resolución de nanosegundos, en lugar de `clock_gettime(CLOCK_THREAD_CPUTIME_ID)` que tiene una resolución de 10 ms. (Contribuido por Batuhan Taskaya en bpo-40192)

### sys

Se agregó un nuevo atributo `sys.platlibdir`: nombre del directorio de biblioteca específico de la plataforma. Se utiliza para construir la ruta de la biblioteca estándar y las rutas de los módulos de extensión instalados. Es igual a `"lib"` en la mayoría de las plataformas. En Fedora y SuSE, es igual a `"lib64"` en plataformas de 64 bits. (Contribuido por Jan Matějek, Matěj Cepl, Charalampos Stratakis y Victor Stinner en bpo-1294959.)

Anteriormente, `sys.stderr` estaba bloqueado en búfer cuando no era interactivo. Ahora `stderr` tiene como valor predeterminado que siempre tenga búfer de línea. (Contribuido por Jendrik Seipp en bpo-13601.)

### tracemalloc

Se agregó `tracemalloc.reset_peak()` para establecer el tamaño máximo de los bloques de memoria rastreados al tamaño actual, para medir el pico de piezas de código específicas. (Contribuido por Huon Wilson en bpo-40630.)

### mecanografía

PEP 593 introdujo un tipo `typing.Annotated` para decorar tipos existentes con metadatos específicos del contexto y el nuevo parámetro `include_extras` en `typing.get_type_hints()` para acceder a los metadatos en tiempo de ejecución. (Contribuido por Till Varoquaux y Konstantin Kashin.)

### unicodedata

La base de datos Unicode se ha actualizado a la versión 13.0.0. (bpo-39926).

### venv

Los scripts de activación proporcionados por `venv` ahora especifican su personalización de solicitud de manera consistente utilizando siempre el valor especificado por `__VENV_PROMPT__`. Anteriormente, algunos scripts usaban `__VENV_PROMPT__` incondicionalmente, otros solo si estaba configurado (que era el caso predeterminado) y uno usaba `__VENV_NAME__` en su lugar. (Contribuido por Brett Cannon en bpo-37663.)

### xml

Los caracteres de espacio en blanco dentro de los atributos ahora se conservan al serializar `xml.etree.ElementTree` en un archivo XML. Los EOLN ya no se normalizan a «n». Este es el resultado de la discusión sobre cómo interpretar la sección 2.11 de la especificación XML. (Contribuido por Mefistotelis en bpo-39011.)

## Optimizaciones

- Optimización del idioma para la asignación de una variable temporal en las comprensiones. Ahora `for y in [expr]` en comprensiones es tan rápido como una simple asignación `y = expr`. Por ejemplo:

  > sumas = [s para s en [0] para x en datos para s en [s + x]]

  A diferencia del operador `:=`, este idioma no filtra una variable al alcance externo.

  (Contribuido por Serhiy Storchaka en bpo-32856.)

- Manejo de señal optimizado en aplicaciones multiproceso. Si un subproceso diferente al subproceso principal recibe una señal, el bucle de evaluación del código de bytes ya no se interrumpe en cada instrucción de código de bytes para verificar si hay señales pendientes que no se pueden manejar. Solo el hilo principal del intérprete principal puede manejar señales.

  Anteriormente, el ciclo de evaluación del código de bytes se interrumpía en cada instrucción hasta que el hilo principal manejaba las señales. (Contribuido por Victor Stinner en bpo-40010.)

- Optimicé el módulo `subprocess` en FreeBSD usando `closefrom()`. (Contribuido por Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak y Victor Stinner en bpo-38061.)

- `PyLong_FromDouble()` ahora es hasta 1,87 veces más rápido para valores que se ajustan a long. (Contribuido por Sergey Fedoseev en bpo-37986.)

- Varias incorporaciones de Python (`range`, `tuple`, `set`, `frozenset`, `list`, `dict`) ahora se aceleran mediante el protocolo de llamada vectorial PEP 590. (Contribuido por Dong-hee Na, Mark Shannon, Jeroen Demeyer y Petr Viktorin en bpo-37207.)

- `difference_update()` optimizado para el caso en el que el otro conjunto es mucho más grande que el conjunto base. (Sugerido por Evgeny Kapun con código aportado por Michele Orrù en bpo-8425.)

- El asignador de objetos pequeños de Python (`obmalloc.c`) ahora permite (no más de) que una arena vacía permanezca disponible para su reutilización inmediata, sin devolverla al sistema operativo. Esto evita la paliza en bucles simples donde una arena podría crearse y destruirse de nuevo en cada iteración. (Contribuido por Tim Peters en bpo-37257.)

- floor division de operación flotante ahora tiene un mejor rendimiento. También se actualiza el mensaje de `ZeroDivisionError` para esta operación. (Contribuido por Dong-hee Na en bpo-39434.)

- La decodificación de cadenas cortas ASCII con códecs UTF-8 y ascii ahora es aproximadamente un 15% más rápida. (Contribuido por Inada Naoki en bpo-37348.)

A continuación, se muestra un resumen de las mejoras de rendimiento desde Python 3.4 hasta Python 3.9:

    Python version                       3.4     3.5     3.6     3.7     3.8    3.9
    --------------                       ---     ---     ---     ---     ---    ---

    Variable and attribute read access:
        read_local                       7.1     7.1     5.4     5.1     3.9    3.9
        read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
        read_global                     15.5    19.0    14.3    13.6     7.6    7.8
        read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
        read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
        read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
        read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
        read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
        read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
        read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

    Variable and attribute write access:
        write_local                      8.7     9.3     5.5     5.3     4.3    4.3
        write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
        write_global                    19.7    21.2    18.0    18.0    15.8   16.7
        write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
        write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
        write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

    Data structure read access:
        read_list                       24.2    24.5    20.8    20.8    19.0   19.5
        read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
        read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
        read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

    Data structure write access:
        write_list                      27.1    28.5    22.5    21.6    20.0   20.0
        write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
        write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
        write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

    Stack (or queue) operations:
        list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
        deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
        deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

    Timing loop:
        loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

Estos resultados se generaron a partir del script de referencia de acceso variable en: `Tools/scripts/var_access_benchmark.py`. El script de referencia muestra tiempos en nanosegundos. Los puntos de referencia se midieron en un Intel® Core™ i7-4960HQ processor que ejecuta las compilaciones de macOS de 64 bits que se encuentran en python.org.

## Obsoleto

- El comando distutils `bdist_msi` ahora está en desuso, use `bdist_wheel` (paquetes de ruedas) en su lugar. (Contribuido por Hugo van Kemenade en bpo-39586.)

- Actualmente, `math.factorial()` acepta instancias de `float` con valores enteros no negativos (como `5.0`). Sube un `ValueError` para flotadores no integrales y negativos. Ahora está en desuso. En futuras versiones de Python, lanzará un `TypeError` para todos los flotadores. (Contribuido por Serhiy Storchaka en bpo-37315.)

- Los módulos `parser` y `symbol` están obsoletos y se eliminarán en futuras versiones de Python. Para la mayoría de los casos de uso, los usuarios pueden aprovechar la etapa de generación y compilación del árbol de sintaxis abstracta (AST), utilizando el módulo `ast`.

- Las funciones de la API pública de C `PyParser_SimpleParseStringFlags()`, `PyParser_SimpleParseStringFlagsFilename()`, `PyParser_SimpleParseFileFlags()` y `PyNode_Compile()` están en desuso y se eliminarán en Python 3.10 junto con el analizador anterior.

- El uso de `NotImplemented` en un contexto booleano ha quedado obsoleto, ya que es casi exclusivamente el resultado de implementaciones incorrectas de comparadores ricos. Se convertirá en `TypeError` en una versión futura de Python. (Contribuido por Josh Rosenberg en bpo-35712.)

- El módulo `random` actualmente acepta cualquier tipo hash como posible valor semilla. Desafortunadamente, no se garantiza que algunos de esos tipos tengan un valor hash determinista. Después de Python 3.9, el módulo restringirá sus semillas a `None`, `int`, `float`, `str`, `bytes` y `bytearray`.

- Abrir el archivo `GzipFile` para escritura sin especificar el argumento mode argument is deprecated. In future Python versions it will always be opened for reading by default. Specify the mode para abrirlo para escribir y silenciar una advertencia. (Contribuido por Serhiy Storchaka en bpo-28286.)

- En desuso el `` split () `` method of `_tkinter.TkappType` en favor del método `splitlist()` que tiene un comportamiento más consistente y predecible. (Contribuido por Serhiy Storchaka en bpo-38371.)

- El paso explícito de objetos de rutina a `asyncio.wait()` ha quedado obsoleto y se eliminará en la versión 3.11. (Contribuido por Yury Selivanov y Kyle Stanley en bpo-34790.)

- Los estándares binhex4 y hexbin4 ahora están en desuso. El módulo `binhex` y las siguientes funciones `binascii` ahora están en desuso:

  - `b2a_hqx()`, `a2b_hqx()`

  - `rlecode_hqx()`, `rledecode_hqx()`

  (Contribuido por Victor Stinner en bpo-39353.)

- Las clases `ast` `slice`, `Index` y `ExtSlice` se consideran obsoletas y se eliminarán en futuras versiones de Python. El propio `value` debe utilizarse en lugar de `Index(value)`. Se debe utilizar `Tuple(slices, Load())` en lugar de `ExtSlice(slices)`. (Contribuido por Serhiy Storchaka en bpo-34822.)

- Las clases `ast` `Suite`, `Param`, `AugLoad` y `AugStore` se consideran obsoletas y se eliminarán en futuras versiones de Python. No fueron generados por el analizador y no aceptados por el generador de código en Python 3. (Contribuido por Batuhan Taskaya en bpo-39639 y bpo-39969 y Serhiy Storchaka en bpo-39988).

- Las funciones `PyEval_InitThreads()` y `PyEval_ThreadsInitialized()` ahora están en desuso y se eliminarán en Python 3.11. Llamar a `PyEval_InitThreads()` ahora no hace nada. GIL es inicializado por `Py_Initialize()` desde Python 3.7. (Contribuido por Victor Stinner en bpo-39877.)

- Pasar `None` como primer argumento a la función `shlex.split()` ha quedado obsoleto. (Contribuido por Zackery Spytz en bpo-33262.)

- `smtpd.MailmanProxy()` ahora está en desuso porque no se puede utilizar sin un módulo externo, `mailman`. (Contribuido por Samuel Colvin en bpo-35800.)

- El módulo `lib2to3` ahora emite un `PendingDeprecationWarning`. Python 3.9 cambió a un analizador PEG (consulte PEP 617), y Python 3.10 puede incluir una nueva sintaxis de lenguaje que no es analizable por el analizador LL (1) de lib2to3. El módulo `lib2to3` puede eliminarse de la biblioteca estándar en una versión futura de Python. Considere alternativas de terceros como LibCST o parso. (Contribuido por Carl Meyer en bpo-40360.)

- El parámetro random de `random.shuffle()` ha quedado obsoleto. (Contribuido por Raymond Hettinger en bpo-40465)

## Remoto

- Se ha eliminado la versión errónea en `unittest.mock.__version__`.

- `nntplib.NNTP`: Se han eliminado los métodos `xpath()` y `xgtitle()`. Estos métodos están obsoletos desde Python 3.3. Generalmente, estas extensiones no son compatibles o no están habilitadas por los administradores del servidor NNTP. Para `xgtitle()`, utilice `nntplib.NNTP.descriptions()` o `nntplib.NNTP.description()` en su lugar. (Contribuido por Dong-hee Na en bpo-39366.)

- `array.array`: Se han eliminado los métodos `tostring()` y `fromstring()`. Eran alias de `tobytes()` y `frombytes()`, obsoletos desde Python 3.2. (Contribuido por Victor Stinner en bpo-38916.)

- Se ha eliminado la función `sys.callstats()` sin documentar. Desde Python 3.7, quedó obsoleto y siempre devolvió `None`. Requería una opción de compilación especial `CALL_PROFILE` que ya se eliminó en Python 3.7. (Contribuido por Victor Stinner en bpo-37414.)

- Se han eliminado las funciones `sys.getcheckinterval()` y `sys.setcheckinterval()`. Fueron obsoletos desde Python 3.2. Utilice `sys.getswitchinterval()` y `sys.setswitchinterval()` en su lugar. (Contribuido por Victor Stinner en bpo-37392.)

- Se ha eliminado la función C `PyImport_Cleanup()`. Se documentó como: «Vacíe la tabla del módulo. Solo para uso interno». (Contribuido por Victor Stinner en bpo-36710.)

- Se han eliminado los módulos `_dummy_thread` y `dummy_threading`. Estos módulos quedaron obsoletos desde Python 3.7, que requiere compatibilidad con subprocesos. (Contribuido por Victor Stinner en bpo-37312.)

- Se han eliminado el alias de `aifc.openfp()` a `aifc.open()`, el alias de `sunau.openfp()` a `sunau.open()` y el alias de `wave.openfp()` a `wave.open()`. Fueron obsoletos desde Python 3.7. (Contribuido por Victor Stinner en bpo-37320.)

- Se ha eliminado el método `isAlive()` de `threading.Thread`. Quedó en desuso desde Python 3.8. Utilice `is_alive()` en su lugar. (Contribuido por Dong-hee Na en bpo-37804.)

- Se han eliminado los métodos `getchildren()` y `getiterator()` de las clases `ElementTree` y `Element` en el módulo `ElementTree`. Fueron obsoletos en Python 3.2. Utilice `iter(x)` o `list(x)` en lugar de `x.getchildren()` y `x.iter()` o `list(x.iter())` en lugar de `x.getiterator()`. (Contribuido por Serhiy Storchaka en bpo-36543.)

- Se eliminó la antigua API `plistlib`, quedó en desuso desde Python 3.4. Utilice las funciones `load()`, `loads()`, `dump()` y `dumps()`. Además, se eliminó el parámetro use_builtin_types; en su lugar, siempre se utilizan objetos `bytes` estándar. (Contribuido por Jon Janzen en bpo-36409.)

- Se ha eliminado la función C `PyGen_NeedsFinalizing`. No se documentó, probó ni usó en ningún lugar dentro de CPython después de la implementación de PEP 442. Parche de Joannah Nanjekye. (Contribuido por Joannah Nanjekye en bpo-15088)

- `base64.encodestring()` y `base64.decodestring()`, los alias obsoletos desde Python 3.1, se han eliminado: utilice `base64.encodebytes()` y `base64.decodebytes()` en su lugar. (Contribuido por Victor Stinner en bpo-39351.)

- La función `fractions.gcd()` se ha eliminado, está obsoleta desde Python 3.5 (bpo-22486): utilice `math.gcd()` en su lugar. (Contribuido por Victor Stinner en bpo-39350.)

- Se ha eliminado el parámetro buffering de `bz2.BZ2File`. Desde Python 3.0, se ignoró y su uso emitió un `DeprecationWarning`. Pase un objeto de archivo abierto para controlar cómo se abre el archivo. (Contribuido por Victor Stinner en bpo-39357.)

- Se ha eliminado el parámetro encoding de `json.loads()`. A partir de Python 3.1, fue obsoleto e ignorado; su uso ha emitido un `DeprecationWarning` desde Python 3.8. (Contribuido por Inada Naoki en bpo-39377)

- Las declaraciones `with (await asyncio.lock):` y `with (yield from asyncio.lock):` ya no son compatibles, utilice `async with lock` en su lugar. Lo mismo es correcto para `asyncio.Condition` y `asyncio.Semaphore`. (Contribuido por Andrew Svetlov en bpo-34793.)

- Se han eliminado la función `sys.getcounts()`, la opción de línea de comando `-X showalloccount` y el campo `show_alloc_count` de la estructura C `PyConfig`. Necesitaban una compilación especial de Python definiendo la macro `COUNT_ALLOCS`. (Contribuido por Victor Stinner en bpo-39489.)

- Se ha eliminado el atributo `_field_types` de la clase `typing.NamedTuple`. Quedó en desuso desde Python 3.8. En su lugar, utilice el atributo `__annotations__`. (Contribuido por Serhiy Storchaka en bpo-40182.)

- Se ha eliminado el método `symtable.SymbolTable.has_exec()`. Quedó en desuso desde 2006 y solo devuelve `False` cuando se llama. (Contribuido por Batuhan Taskaya en bpo-40208)

- Se han eliminado `asyncio.Task.current_task()` y `asyncio.Task.all_tasks()`. Fueron obsoletos desde Python 3.7 y puede usar `asyncio.current_task()` y `asyncio.all_tasks()` en su lugar. (Contribución de Rémi Lapeyre en bpo-40967)

- El método `unescape()` en la clase `html.parser.HTMLParser` se ha eliminado (quedó obsoleto desde Python 3.4). `html.unescape()` debe usarse para convertir referencias de caracteres a los caracteres Unicode correspondientes.

## Portar a Python 3.9

Esta sección enumera los cambios descritos anteriormente y otras correcciones de errores que pueden requerir cambios en su código.

### Cambios en la API de Python

- `__import__()` y `importlib.util.resolve_name()` ahora lanzan `ImportError` donde anteriormente lanzaban `ValueError`. Las personas que llaman que detectan el tipo de excepción específico y son compatibles con Python 3.9 y versiones anteriores deberán detectar ambas usando `except (ImportError, ValueError):`.

- Los scripts de activación de `venv` ya no son casos especiales cuando `__VENV_PROMPT__` se establece en `""`.

- El método `select.epoll.unregister()` ya no ignora el error `EBADF`. (Contribuido por Victor Stinner en bpo-39239.)

- Se ha eliminado el parámetro compresslevel `bz2.BZ2File` se convirtió solo en un parámetro de llave, ya que buffering se quitó. (Contribuido por Victor Stinner en bpo-39357.)

- AST simplificado para suscripción. Los índices simples se representarán por su valor, los segmentos extendidos se representarán como tuplas. `Index(value)` devolverá un `value` en sí mismo, `ExtSlice(slices)` devolverá `Tuple(slices, Load())`. (Contribuido por Serhiy Storchaka en bpo-34822.)

- El módulo `importlib` ahora ignora la variable de entorno `PYTHONCASEOK` cuando se utilizan las opciones de línea de comando `-E` o `-I`.

- El parámetro encoding se ha agregado a las clases `ftplib.FTP` y `ftplib.FTP_TLS` como un parámetro de solo palabra clave, y la codificación predeterminada se cambia de Latin-1 a UTF-8 para seguir: rfc: 2640.

- `asyncio.loop.shutdown_default_executor()` se ha agregado a `AbstractEventLoop`, lo que significa que los bucles de eventos alternativos que heredan de él deben tener definido este método. (Contribuido por Kyle Stanley en bpo-34037.)

- Los valores constantes de los indicadores futuros en el módulo `__future__` se actualizan para evitar la colisión con los indicadores del compilador. Anteriormente, `PyCF_ALLOW_TOP_LEVEL_AWAIT` chocaba con `CO_FUTURE_DIVISION`. (Contribuido por Batuhan Taskaya en bpo-39562)

- `array('u')` ahora usa `wchar_t` como tipo C en lugar de `Py_UNICODE`. Este cambio no afecta su comportamiento porque `Py_UNICODE` es alias de `wchar_t` desde Python 3.3. (Contribuido por Inada Naoki en bpo-34538.)

- La API `logging.getLogger()` ahora devuelve el registrador raíz cuando se le pasó el nombre `'root'`, mientras que anteriormente devolvía un registrador no raíz llamado `'root'`. Esto podría afectar los casos en los que el código de usuario desea explícitamente un registrador no root llamado `'root'`, o crea una instancia de un registrador usando `logging.getLogger(__name__)` en algún módulo de nivel superior llamado `'root.py'`. (Contribuido por Vinay Sajip en bpo-37742.)

- El manejo de división de `PurePath` ahora devuelve `NotImplemented` en lugar de lanzar un `TypeError` cuando se pasa algo que no sea una instancia de `str` o `PurePath`. Esto permite crear clases compatibles que no hereden de esos tipos mencionados. (Contribución de Roger Aiudi en bpo-34775).

- A partir de Python 3.9.5, el módulo `ipaddress` ya no acepta ceros a la izquierda en las cadenas de direcciones IPv4. Los ceros iniciales son ambiguos y algunas bibliotecas los interpretan como notación octal. Por ejemplo, la función heredada `socket.inet_aton()` trata los ceros iniciales como una notación octal. La implementación glibc del `inet_pton()` moderno no acepta ceros a la izquierda. (Contribuido por Christian Heimes en bpo-36384).

- `codecs.lookup()` ahora normaliza el nombre de codificación de la misma manera que `encodings.normalize_encoding()`, excepto que `codecs.lookup()` también convierte el nombre a minúsculas. Por ejemplo, el nombre de codificación `"latex+latin1"` ahora está normalizado a `"latex_latin1"`. (Contribuido por Jordon Xu en bpo-37751.)

### Cambios en la API de C

- Las instancias de heap-allocated types (como las creadas con `PyType_FromSpec()` y API similares) contienen una referencia a su objeto de tipo desde Python 3.8. Como se indica en los «Cambios en la API C» de Python 3.8, para la gran mayoría de los casos, no debería haber efectos secundarios, pero para los tipos que tienen una función personalizada `tp_traverse`, asegúrese de que todas las funciones `tp_traverse` personalizadas de los tipos asignados al montón visitan el tipo del objeto.

  > Ejemplo:

  >     int
  >     foo_traverse(foo_struct *self, visitproc visit, void *arg) {
  >     // Rest of the traverse function
  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (Python issue 35810 and 40217)
  >         Py_VISIT(Py_TYPE(self));
  >     #endif
  >     }

  Si su función transversal delega en `tp_traverse` de su clase base (u otro tipo), asegúrese de que `Py_TYPE(self)` se visite solo una vez. Tenga en cuenta que solo se espera que heap type visite el tipo en `tp_traverse`.

  > Por ejemplo, si su función `tp_traverse` incluye:

  >     base->tp_traverse(self, visit, arg)

  > Luego añade:

  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (bpo-35810 and bpo-40217)
  >         if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
  >             // a heap type's tp_traverse already visited Py_TYPE(self)
  >         } else {
  >             Py_VISIT(Py_TYPE(self));
  >         }
  >     #else

  (Consulte bpo-35810 y bpo-40217 para obtener más información).

- Las funciones `PyEval_CallObject`, `PyEval_CallFunction`, `PyEval_CallMethod` y `PyEval_CallObjectWithKeywords` están en desuso. Utilice `PyObject_Call()` y sus variantes en su lugar. (Ver más detalles en bpo-29548.)

### Cambios en el código de bytes de CPython

- Se agregó el código de operación `LOAD_ASSERTION_ERROR` para manejar la declaración `assert`. Anteriormente, la declaración de aserción no funcionaría correctamente si la excepción `AssertionError` estuviera siendo sombreada. (Contribuido por Zackery Spytz en bpo-34880.)

- El código de operación `COMPARE_OP` se dividió en cuatro instrucciones distintas:

  - `COMPARE_OP` para comparaciones enriquecidas

  - `IS_OP` para pruebas “es” y “no es”

  - `CONTAINS_OP` para pruebas “in” y “not in”

  - `JUMP_IF_NOT_EXC_MATCH` para verificar las excepciones en las declaraciones “try-except”.

  (Contribuido por Mark Shannon en bpo-39156.)

## Construir cambios

- Se agregó la opción `--with-platlibdir` al script `configure`: nombre del directorio de biblioteca específico de la plataforma, almacenado en el nuevo atributo `sys.platlibdir`. Consulte el atributo `sys.platlibdir` para obtener más información. (Contribuido por Jan Matějek, Matěj Cepl, Charalampos Stratakis y Victor Stinner en bpo-1294959.)

- Se ha eliminado la macro de compilación especial `COUNT_ALLOCS`. (Contribuido por Victor Stinner en bpo-39489.)

- En plataformas que no son de Windows, ahora se requieren las funciones `setenv()` y `unsetenv()` para compilar Python. (Contribuido por Victor Stinner en bpo-39395.)

- En plataformas que no son de Windows, la creación de instaladores `bdist_wininst` ahora no es compatible oficialmente. (Consulte bpo-10945 para obtener más detalles).

- Al compilar Python en macOS desde la fuente, `_tkinter` ahora se vincula con marcos Tcl y Tk que no son del sistema si están instalados en `/Library/Frameworks`, como había sido el caso en versiones anteriores de macOS. Si un SDK de macOS está configurado explícitamente, mediante `--enable-universalsdk` o `-isysroot`, solo se busca en el SDK. El comportamiento predeterminado aún se puede anular con `--with-tcltk-includes` y `--with-tcltk-libs`. (Contribuido por Ned Deily en bpo-34956.)

- Python ahora se puede construir para Windows 10 ARM64. (Contribuido por Steve Dower en bpo-33125.)

- Algunas pruebas individuales ahora se omiten cuando se usa `--pgo`. Las pruebas en cuestión aumentaron significativamente el tiempo de la tarea PGO y probablemente no ayudaron a mejorar la optimización del ejecutable final. Esto acelera la tarea en un factor de aproximadamente 15 veces. La ejecución del conjunto de pruebas unitarias completo es lenta. Este cambio puede resultar en una compilación ligeramente menos optimizada ya que no se ejecutarán tantas ramas de código. Si está dispuesto a esperar la compilación mucho más lenta, el comportamiento anterior se puede restaurar usando `./configure [..] PROFILE_TASK="-m test --pgo-extended"`. No garantizamos qué conjunto de tareas de PGO produce una compilación más rápida. Los usuarios interesados deben ejecutar sus propios puntos de referencia relevantes, ya que los resultados pueden depender del entorno, la carga de trabajo y la cadena de herramientas del compilador. (Consulte bpo-36044 y bpo-37707 para obtener más detalles).

## Cambios en la API de C

### Nuevas características

- PEP 573: Se agregó `PyType_FromModuleAndSpec()` para asociar un módulo con una clase; `PyType_GetModule()` y `PyType_GetModuleState()` para recuperar el módulo y su estado; y `PyCMethod` y `METH_METHOD` para permitir que un método acceda a la clase en la que se definió. (Contribuido por Marcel Plch y Petr Viktorin en bpo-38787.)

- Se agregó la función `PyFrame_GetCode()`: obtenga un código de marco. Se agregó la función `PyFrame_GetBack()`: obtenga el siguiente marco exterior del marco. (Contribuido por Victor Stinner en bpo-40421.)

- Se agregó `PyFrame_GetLineNumber()` a la API C limitada. (Contribuido por Victor Stinner en bpo-40421.)

- Se agregaron funciones `PyThreadState_GetInterpreter()` y `PyInterpreterState_Get()` para obtener el intérprete. Se agregó la función `PyThreadState_GetFrame()` para obtener el marco actual de un estado de subproceso de Python. Se agregó la función `PyThreadState_GetID()`: obtenga el identificador único de un estado de subproceso de Python. (Contribuido por Victor Stinner en bpo-39947.)

- Se agregó una nueva función pública `PyObject_CallNoArgs()` a la API de C, que llama a un objeto de Python invocable sin ningún argumento. Es la forma más eficiente de llamar a un objeto de Python invocable sin ningún argumento. (Contribuido por Victor Stinner en bpo-37194.)

- Cambios en la API C limitada (si se define la macro `Py_LIMITED_API`):

  - Proporcione `Py_EnterRecursiveCall()` y `Py_LeaveRecursiveCall()` como funciones regulares para la API limitada. Anteriormente, se definían como macros, pero estas macros no se compilaban con la API C limitada que no puede acceder al campo `PyThreadState.recursion_depth` (la estructura es opaca en la API C limitada).

  - `PyObject_INIT()` y `PyObject_INIT_VAR()` se convierten en funciones «opacas» habituales para ocultar los detalles de la implementación.

  (Contribuido por Victor Stinner en bpo-38644 y bpo-39542.)

- Se agrega la función `PyModule_AddType()` para ayudar a agregar un tipo a un módulo. (Contribuido por Dong-hee Na en bpo-40024.)

- Se agregaron las funciones `PyObject_GC_IsTracked()` y `PyObject_GC_IsFinalized()` a la API pública para permitir consultar si los objetos de Python se están rastreando actualmente o si ya han sido finalizados por el recolector de basura, respectivamente. (Contribuido por Pablo Galindo Salgado en bpo-40241.)

- Se agregó `_PyObject_FunctionStr()` para obtener una representación de cadena fácil de usar de un objeto similar a una función. (Parche de Jeroen Demeyer en bpo-37645.)

- Se agregó `PyObject_CallOneArg()` para llamar a un objeto con un argumento posicional (parche de Jeroen Demeyer en bpo-37483).

### Portar a Python 3.9

- `PyInterpreterState.eval_frame` (PEP 523) ahora requiere un nuevo parámetro tstate obligatorio (`PyThreadState*`). (Contribuido por Victor Stinner en bpo-38500.)

- Módulos de extensión: ~PyModuleDef.m_traverse, `m_clear` y `m_free` Las funciones de `PyModuleDef` ya no se llaman si el estado del módulo era solicitado pero aún no asignado. Este es el caso inmediatamente después de que se crea el módulo y antes de que se ejecute (función `Py_mod_exec`). Más precisamente, estas funciones no se llaman si: c: member: ~ PyModuleDef.m_size es mayor que 0 y el estado del módulo (como lo devuelve `PyModule_GetState()`) es `NULL`.

  Los módulos de extensión sin estado de módulo (`m_size <= 0`) no se ven afectados.

- Si se llama a `Py_AddPendingCall()` en un subinterpretador, la función ahora está programada para ser llamada desde el subinterpretador, en lugar de ser llamada desde el intérprete principal. Cada subinterpretador ahora tiene su propia lista de llamadas programadas. (Contribuido por Victor Stinner en bpo-39984.)

- El registro de Windows ya no se usa para inicializar `sys.path` cuando se usa la opción `-E` (si `PyConfig.use_environment` está configurado en `0`). Esto es importante al incrustar Python en Windows. (Contribuido por Zackery Spytz en bpo-8901.)

- La variable global `PyStructSequence_UnnamedField` ahora es una constante y se refiere a una cadena constante. (Contribuido por Serhiy Storchaka en bpo-38650.)

- La estructura `PyGC_Head` ahora es opaca. Solo se define en la API C interna (`pycore_gc.h`). (Contribuido por Victor Stinner en bpo-40241.)

- `Py_UNICODE_COPY`, `Py_UNICODE_FILL`, `PyUnicode_WSTR_LENGTH`, `PyUnicode_FromUnicode()`, `PyUnicode_AsUnicode()`, `_PyUnicode_AsUnicode` y `PyUnicode_AsUnicodeAndSize()` están marcados como obsoletos en C. Han sido obsoletos por PEP 393 desde Python 3.3. (Contribuido por Inada Naoki en bpo-36346.)

- La función `Py_FatalError()` se reemplaza con una macro que registra automáticamente el nombre de la función actual, a menos que se defina la macro `Py_LIMITED_API`. (Contribuido por Victor Stinner en bpo-39882.)

- El protocolo vectorcall ahora requiere que la persona que llama solo pase cadenas como nombres de palabras clave. (Consulte bpo-37540 para obtener más información).

- Los detalles de implementación de una serie de macros y funciones ahora están ocultos:

  - La macro `PyObject_IS_GC()` se convirtió en una función.

  - La macro `PyObject_NEW()` se convierte en un alias de la macro `PyObject_New()` y la macro `PyObject_NEW_VAR()` se convierte en un alias de la macro `PyObject_NewVar()`. Ya no acceden directamente al miembro `PyTypeObject.tp_basicsize`.

  - La macro `PyObject_GET_WEAKREFS_LISTPTR()` se convirtió en una función: la macro accedió directamente al miembro `PyTypeObject.tp_weaklistoffset`.

  - La macro `PyObject_CheckBuffer()` se convirtió en una función: la macro accedió directamente al miembro `PyTypeObject.tp_as_buffer`.

  - `PyIndex_Check()` ahora siempre se declara como una función opaca para ocultar los detalles de implementación: se eliminó la macro `PyIndex_Check()`. La macro accedió directamente al miembro `PyTypeObject.tp_as_number`.

  (Consulte bpo-40170 para obtener más detalles).

### Remoto

- Se excluyeron las macros `PyFPE_START_PROTECT()` y `PyFPE_END_PROTECT()` de `pyfpe.h` de la API C limitada. (Contribuido por Victor Stinner en bpo-38835.)

- Se ha eliminado la ranura `tp_print` de PyTypeObject. Se usó para imprimir objetos en archivos en Python 2.7 y antes. Desde Python 3.0, se ha ignorado y no se ha utilizado. (Contribuido por Jeroen Demeyer en bpo-36974.)

- Cambios en la API C limitada (si se define la macro `Py_LIMITED_API`):

  - Se excluyeron las siguientes funciones de la API C limitada:

    - `PyThreadState_DeleteCurrent()` (Contribuido por Joannah Nanjekye en bpo-37878.)

    - `_Py_CheckRecursionLimit`

    - `_Py_NewReference()`

    - `_Py_ForgetReference()`

    - `_PyTraceMalloc_NewReference()`

    - `_Py_GetRefTotal()`

    - El mecanismo de papelera que nunca funcionó en la API C limitada.

    - `PyTrash_UNWIND_LEVEL`

    - `Py_TRASHCAN_BEGIN_CONDITION`

    - `Py_TRASHCAN_BEGIN`

    - `Py_TRASHCAN_END`

    - `Py_TRASHCAN_SAFE_BEGIN`

    - `Py_TRASHCAN_SAFE_END`

  - Se movieron las siguientes funciones y definiciones a la API de C interna:

    - `_PyDebug_PrintTotalRefs()`

    - `_Py_PrintReferences()`

    - `_Py_PrintReferenceAddresses()`

    - `_Py_tracemalloc_config`

    - `_Py_AddToAllObjects()` (específico para `Py_TRACE_REFS` acumulación)

  (Contribuido por Victor Stinner en bpo-38644 y bpo-39542.)

- Se eliminó el gancho `_PyRuntime.getframe` y se eliminó la macro `_PyThreadState_GetFrame`, que era un alias de `_PyRuntime.getframe`. Solo fueron expuestos por la API C interna. También se eliminó el tipo `PyThreadFrameGetter`. (Contribuido por Victor Stinner en bpo-39946.)

- Se eliminaron las siguientes funciones de la API de C. Llame a `PyGC_Collect()` explícitamente para borrar todas las listas libres. (Contribuido por Inada Naoki y Victor Stinner en bpo-37340, bpo-38896 y bpo-40428.)

  - `PyAsyncGen_ClearFreeLists()`

  - `PyContext_ClearFreeList()`

  - `PyDict_ClearFreeList()`

  - `PyFloat_ClearFreeList()`

  - `PyFrame_ClearFreeList()`

  - `PyList_ClearFreeList()`

  - `PyMethod_ClearFreeList()` y `PyCFunction_ClearFreeList()`: se han eliminado las listas libres de objetos de método enlazados.

  - `PySet_ClearFreeList()`: la lista de conjuntos libres se ha eliminado en Python 3.4.

  - `PyTuple_ClearFreeList()`

  - `PyUnicode_ClearFreeList()`: la lista libre de Unicode se ha eliminado en Python 3.3.

- Función `_PyUnicode_ClearStaticStrings()` eliminada. (Contribuido por Victor Stinner en bpo-39465.)

- Eliminado `Py_UNICODE_MATCH`. Ha sido obsoleto por PEP 393 y roto desde Python 3.3. En su lugar, se puede utilizar la función `PyUnicode_Tailmatch()`. (Contribuido por Inada Naoki en bpo-36346.)

- Archivos de encabezado limpios de interfaces definidas pero sin implementación. Los símbolos API públicos que se eliminan son: `_PyBytes_InsertThousandsGroupingLocale`, `_PyBytes_InsertThousandsGrouping`, `_Py_InitializeFromArgs`, `_Py_InitializeFromWideArgs`, `_PyFloat_Repr`, `_PyFloat_Digits`, `_PyFloat_DigitsInit`, `PyFrame_ExtendStack`, `_PyAIterWrapper_Type`, `PyNullImporter_Type`, `PyCmpWrapper_Type`, `PySortWrapper_Type`, `PyNoArgsFunction`. (Contribuido por Pablo Galindo Salgado en bpo-39372.)

## Cambios notables en Python 3.9.1

### mecanografía

El comportamiento de `typing.Literal` se modificó para cumplir con PEP 586 y para coincidir con el comportamiento de los verificadores de tipo estático especificados en el PEP.

1. `Literal` ahora elimina los parámetros duplicados.

2. Las comparaciones de igualdad entre objetos `Literal` ahora son independientes del orden.

3. Las comparaciones de `Literal` ahora respetan los tipos. Por ejemplo, `Literal[0] == Literal[False]` evaluado previamente como `True`. Ahora es `False`. Para respaldar este cambio, la caché de tipos utilizada internamente ahora admite tipos diferenciados.

4. Los objetos `Literal` ahora lanzarán una excepción `TypeError` durante las comparaciones de igualdad si alguno de sus parámetros no es hashable. Tenga en cuenta que declarar `Literal` con parámetros mutables no arrojará un error:

       >>> from typing import Literal
       >>> Literal[{0}]
       >>> Literal[{0}] == Literal[{False}]
       Traceback (most recent call last):
         File "<stdin>", line 1, in <module>
       TypeError: unhashable type: 'set'

(Contribuido por Yurii Karabas en bpo-42345.)

### Compatibilidad con macOS 11.0 (Big Sur) y Apple Silicon Mac

A partir de 3.9.1, Python ahora es totalmente compatible con la construcción y ejecución en macOS 11.0 (Big Sur) y en Apple Silicon Macs (basado en la arquitectura `ARM64`). Una nueva variante de compilación universal, `universal2`, ahora está disponible para admitir de forma nativa tanto `ARM64` como `Intel 64` en un conjunto de ejecutables. Los binarios ahora también se pueden construir en versiones actuales de macOS para ser implementados en una variedad de versiones anteriores de macOS (probadas a 10.9) mientras hacen que algunas funciones y opciones más nuevas del sistema operativo estén disponibles condicionalmente según la versión del sistema operativo en uso en tiempo de ejecución («vinculación débil» ).

(Contribuido por Ronald Oussoren y Lawrence D’Anna en bpo-41100.)

## Cambios notables en Python 3.9.2

### colecciones.abc

`collections.abc.Callable` genérico ahora aplana los parámetros de tipo, similar a lo que hace actualmente `typing.Callable`. Esto significa que `collections.abc.Callable[[int, str], str]` tendrá `__args__` de `(int, str, str)`; anteriormente esto era `([int, str], str)`. Para permitir este cambio, `types.GenericAlias` ahora puede ser subclasificado, y se devolverá una subclase al subíndice el tipo `collections.abc.Callable`. El código que accede a los argumentos a través de `typing.get_args()` o `__args__` debe tener en cuenta este cambio. Se puede emitir un `DeprecationWarning` para formas no válidas de parametrizar `collections.abc.Callable` que pueden haber pasado silenciosamente en Python 3.9.1. Este `DeprecationWarning` se convertirá en un `TypeError` en Python 3.10. (Contribuido por Ken Jin en bpo-42195.)

### urllib.parse

Las versiones anteriores de Python permitían el uso de `;` y `&` como separadores de parámetros de consulta en `urllib.parse.parse_qs()` y `urllib.parse.parse_qsl()`. Debido a problemas de seguridad y para cumplir con las recomendaciones más recientes del W3C, esto se ha cambiado para permitir solo una clave separadora, con `&` como predeterminado. Este cambio también afecta a `cgi.parse()` y `cgi.parse_multipart()` ya que utilizan las funciones afectadas internamente. Para obtener más detalles, consulte su documentación respectiva. (Contribuido por Adam Goldschmidt, Senthil Kumaran y Ken Jin en bpo-42967.)