Qué hay de nuevo en Python 3.9
******************************

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. For full details, see the
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
------------

The "isocalendar()" of "datetime.date" and "isocalendar()" of
"datetime.datetime" methods now returns a "namedtuple()" instead of a
"tuple". (Contributed by Donghee Na in 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
-----

Added constants "F_OFD_GETLK", "F_OFD_SETLK" and "F_OFD_SETLKW".
(Contributed by Donghee Na in bpo-38602.)


ftplib
------

"FTP" and "FTP_TLS" now raise a "ValueError" if the given timeout for
their constructor is zero to prevent the creation of a non-blocking
socket. (Contributed by Donghee Na in 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
----

HTTP status codes "103 EARLY_HINTS", "418 IM_A_TEAPOT" and "425
TOO_EARLY" are added to "http.HTTPStatus". (Contributed by Donghee Na
in bpo-39509 and Ross Rhodes in 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.)

Novedades de la versión de mantenimiento 3.9

Hacer que IDLE invoque "sys.excepthook()" (cuando se inicia sin '-n').
Anteriormente se ignoraban los hooks de usuario.  (Contribuido por Ken
Hilton en bpo-43008.)

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

Reorganizar el diálogo de configuración. Dividir la pestaña General en
Windows y Shell/Ed. Mover las fuentes de ayuda, que amplían el menú
Ayuda, a la pestaña Extensiones. Hacer espacio para nuevas opciones y
acortar el diálogo. Esto último hace que el diálogo se adapte mejor a
las pantallas pequeñas. (Contribuido por Terry Jan Reedy en
bpo-40468.) Mover la configuración del espacio de sangría de la
pestaña Fuente a la nueva pestaña Windows. (Contribuido por Mark
Roseman y Terry Jan Reedy en bpo-33962.)

Aplicar el resaltado de sintaxis a los archivos ".pyi". (Contribución
de Alex Waygood y Terry Jan Reedy en bpo-45447)


imaplib
-------

"IMAP4" and "IMAP4_SSL" now have an optional *timeout* parameter for
their constructors. Also, the "open()" method now has an optional
*timeout* parameter with this change. The overridden methods of
"IMAP4_SSL" and "IMAP4_stream" were applied to this change.
(Contributed by Donghee Na in bpo-38615.)

"imaplib.IMAP4.unselect()" is added. "imaplib.IMAP4.unselect()" frees
server's resources associated with the selected mailbox and returns
the server to the authenticated state. This command performs the same
actions as "imaplib.IMAP4.close()", except that no messages are
permanently removed from the currently selected mailbox. (Contributed
by Donghee Na in 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" and "NNTP_SSL" now raise a "ValueError" if the given timeout
for their constructor is zero to prevent the creation of a non-
blocking socket. (Contributed by Donghee Na in bpo-39259.)


os
--

Added "CLD_KILLED" and "CLD_STOPPED" for "si_code". (Contributed by
Donghee Na in bpo-38493.)

Exposed the Linux-specific "os.pidfd_open()" (bpo-38692) and
"os.P_PIDFD" (bpo-38713) for process management with file descriptors.

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" and "POP3_SSL" now raise a "ValueError" if the given timeout
for their constructor is zero to prevent the creation of a non-
blocking socket. (Contributed by Donghee Na in 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" and "SMTP_SSL" now raise a "ValueError" if the given timeout
for their constructor is zero to prevent the creation of a non-
blocking socket. (Contributed by Donghee Na in bpo-39259.)

"LMTP" constructor  now has an optional *timeout* parameter.
(Contributed by Donghee Na in bpo-39329.)


enchufe
-------

The "socket" module now exports the "CAN_RAW_JOIN_FILTERS" constant on
Linux 4.1 and greater. (Contributed by Stefan Tatschner and Zackery
Spytz in bpo-25780.)

The socket module now supports the "CAN_J1939" protocol on platforms
that support it.  (Contributed by Karl Ding in 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
---

Added a new "sys.platlibdir" attribute: name of the platform-specific
library directory. It is used to build the path of standard library
and the paths of installed extension modules. It is equal to ""lib""
on most platforms.  On Fedora and SuSE, it is equal to ""lib64"" on
64-bit platforms. (Contributed by Jan Matějek, Matěj Cepl, Charalampos
Stratakis and Victor Stinner in bpo-1294959.)

Previously, "sys.stderr" was block-buffered when non-interactive. Now
"stderr" defaults to always being line-buffered. (Contributed by
Jendrik Seipp in 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.)

* A number of Python builtins ("range", "tuple", "set", "frozenset",
  "list", "dict") are now sped up by using **PEP 590** vectorcall
  protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer
  and Petr Viktorin in 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* of float operation now has a better performance.
  Also the message of "ZeroDivisionError" for this operation is
  updated. (Contributed by Donghee Na in 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

These results were generated from the variable access benchmark script
at: "Tools/scripts/var_access_benchmark.py". The benchmark script
displays timings in nanoseconds.  The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor running the macOS 64-bit builds found
at 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".

* The Public C API functions "PyParser_SimpleParseStringFlags()",
  "PyParser_SimpleParseStringFlagsFilename()",
  "PyParser_SimpleParseFileFlags()" and "PyNode_Compile()" are
  deprecated and will be removed in Python 3.10 together with the old
  parser.

* 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 del método "split ()" de "_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).

* The "PyEval_InitThreads()" and "PyEval_ThreadsInitialized()"
  functions are now deprecated and will be removed in Python 3.11.
  Calling "PyEval_InitThreads()" now does nothing. The *GIL* is
  initialized by "Py_Initialize()" since Python 3.7. (Contributed by
  Victor Stinner in 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": "xpath()" and "xgtitle()" methods have been removed.
  These methods are deprecated since Python 3.3. Generally, these
  extensions are not supported or not enabled by NNTP server
  administrators. For "xgtitle()", please use
  "nntplib.NNTP.descriptions()" or "nntplib.NNTP.description()"
  instead. (Contributed by Donghee Na in 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.)

* The "isAlive()" method of "threading.Thread" has been removed. It
  was deprecated since Python 3.8. Use "is_alive()" instead.
  (Contributed by Donghee Na in 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 """".

* The "select.epoll.unregister()" method no longer ignores the "EBADF"
  error. (Contributed by Victor Stinner in 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')" now uses "wchar_t" as C type instead of "Py_UNICODE".
  This change doesn't affect to its behavior because "Py_UNICODE" is
  alias of "wchar_t" since Python 3.3. (Contributed by Inada Naoki in
  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.)

* Division handling of "PurePath" now returns "NotImplemented" instead
  of raising a "TypeError" when passed something other than an
  instance of "str" or "PurePath".  This allows creating compatible
  classes that don't inherit from those mentioned types. (Contributed
  by Roger Aiudi in 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
=================

* Added "--with-platlibdir" option to the "configure" script: name of
  the platform-specific library directory, stored in the new
  "sys.platlibdir" attribute. See "sys.platlibdir" attribute for more
  information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos
  Stratakis and Victor Stinner in 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**: Added "PyType_FromModuleAndSpec()" to associate a
  module with a class; "PyType_GetModule()" and
  "PyType_GetModuleState()" to retrieve the module and its state; and
  "PyCMethod" and "METH_METHOD" to allow a method to access the class
  it was defined in. (Contributed by Marcel Plch and Petr Viktorin in
  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.)

* The "PyModule_AddType()" function is added to help adding a type to
  a module. (Contributed by Donghee Na in 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: "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
  "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.)

* The "Py_UNICODE_COPY", "Py_UNICODE_FILL", "PyUnicode_WSTR_LENGTH",
  "PyUnicode_FromUnicode()", "PyUnicode_AsUnicode()",
  "_PyUnicode_AsUnicode", and "PyUnicode_AsUnicodeAndSize()" are
  marked as deprecated in C.  They have been deprecated by **PEP 393**
  since Python 3.3. (Contributed by Inada Naoki in 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.

  * The "PyObject_NEW()" macro becomes an alias to the "PyObject_New"
    macro, and the "PyObject_NEW_VAR()" macro becomes an alias to the
    "PyObject_NewVar" macro. They no longer access directly the
    "PyTypeObject.tp_basicsize" member.

  * 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.)


Notable changes in Python 3.9.3
===============================

A security fix alters the "ftplib.FTP" behavior to not trust the IPv4
address sent from the remote server when setting up a passive data
channel.  We reuse the ftp server IP address instead.  For unusual
code requiring the old behavior, set a
"trust_server_pasv_ipv4_address" attribute on your FTP instance to
"True".  (See gh-87451)


Notable changes in Python 3.9.5
===============================


urllib.parse
------------

The presence of newline or tab characters in parts of a URL allows for
some forms of attacks. Following the WHATWG specification that updates
**RFC 3986**, ASCII newline "\n", "\r" and tab "\t" characters are
stripped from the URL by the parser in "urllib.parse" preventing such
attacks. The removal characters are controlled by a new module level
variable "urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE". (See gh-88048)


Notable security feature in 3.9.14
==================================

Converting between "int" and "str" in bases other than 2 (binary), 4,
8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now
raises a "ValueError" if the number of digits in string form is above
a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for CVE-2020-10735. This
limit can be configured or disabled by environment variable, command
line flag, or "sys" APIs. See the integer string conversion length
limitation documentation.  The default limit is 4300 digits in string
form.


Notable changes in 3.9.17
=========================


tarfile
-------

* The extraction methods in "tarfile", and "shutil.unpack_archive()",
  have a new a *filter* argument that allows limiting tar features
  than may be surprising or dangerous, such as creating files outside
  the destination directory. See Extraction filters for details. In
  Python 3.12, use without the *filter* argument will show a
  "DeprecationWarning". In Python 3.14, the default will switch to
  "'data'". (Contributed by Petr Viktorin in **PEP 706**.)
