# Novedades de Python 3.12

Editor:

  Adam Turner

Este artículo explica las nuevas características de Python 3.12, en comparación con 3.11. Python 3.12 se lanzó el 2 de octubre de 2023. Para obtener detalles completos, consulte changelog.

Ver también

PEP 693 - Calendario de lanzamiento de Python 3.12

## Resumen: aspectos destacados de la versión

Python 3.12 is a stable release of the Python programming language, with a mix of changes to the language and the standard library. The library changes focus on cleaning up deprecated APIs, usability, and correctness. Of note, the `distutils` package has been removed from the standard library. Filesystem support in `os` and `pathlib` has seen a number of improvements, and several modules have better performance.

Los cambios de idioma se centran en la usabilidad, ya que a f-strings se le han eliminado muchas limitaciones y las sugerencias «¿Quiso decir…» continúan mejorando. La nueva declaración type parameter syntax y `type` mejora la ergonomía para usar generic types y type aliases con controladores de tipo estático.

Este artículo no intenta proporcionar una especificación completa de todas las características nuevas, sino que brinda una descripción general conveniente. Para obtener detalles completos, debe consultar la documentación, como Library Reference y Language Reference. Si desea comprender la implementación completa y la justificación del diseño de un cambio, consulte el PEP para conocer una característica nueva en particular; pero tenga en cuenta que los PEP generalmente no se mantienen actualizados una vez que una característica se ha implementado por completo.

Nuevas características de sintaxis:

- PEP 695, sintaxis de parámetro de tipo y sentencia `type`

Nuevas características gramaticales:

- PEP 701, f-strings en la gramática

Mejoras del intérprete:

- PEP 684, un GIL único por intérprete

- PEP 669, monitorización de bajo impacto

- Improved “Did you mean …” suggestions para excepciones `NameError`, `ImportError` y `SyntaxError`

Mejoras en el modelo de datos de Python:

- PEP 688, usando buffer protocol de Python

Mejoras significativas en la biblioteca estándar:

- La clase `pathlib.Path` ahora admite subclases

- El módulo `os` recibió varias mejoras para el soporte de Windows

- Se ha agregado un command-line interface al módulo `sqlite3`

- Los controles `isinstance()` frente a `runtime-checkable protocols` benefician de una aceleración de entre dos y 20 veces

- El paquete `asyncio` ha tenido una serie de mejoras de rendimiento, y algunos puntos de referencia muestran una aceleración del 75 %.

- Se ha agregado un command-line interface al módulo `uuid`

- Due to the changes in PEP 701, producing tokens via the `tokenize` module is up to 64% faster.

Mejoras de seguridad:

- Reemplaza las implementaciones `hashlib` integradas de SHA1, SHA3, SHA2-384, SHA2-512 y MD5 con código verificado formalmente del proyecto HACL*. Estas implementaciones integradas permanecen como alternativas que solo se utilizan cuando OpenSSL no las proporciona.

Mejoras de la API C:

- PEP 697, nivel de API C inestable

- PEP 683, objetos inmortales

Mejoras en la implementación de CPython:

- PEP 709, comprensión en línea

- CPython support para el perfilador Linux `perf`

- Implementar protección contra desbordamiento de pila en plataformas compatibles

Nuevas funciones de tipado:

- PEP 692, usando `TypedDict` para anotar **kwargs

- PEP 698, decorador `typing.override()`

Depreciaciones, eliminaciones o restricciones importantes:

- PEP 623: elimina `wstr` de los objetos Unicode en la API C de Python, reduciendo el tamaño de cada objeto `str` en al menos 8 bytes.

- PEP 632: Remove the `distutils` package. See the migration guide for advice replacing the APIs it provided. The third-party Setuptools package continues to provide `distutils`, if you still require it in Python 3.12 and beyond.

- gh-95299: No preinstala `setuptools` en entornos virtuales creados con `venv`. Esto significa que `distutils`, `setuptools`, `pkg_resources` y `easy_install` ya no estarán disponibles de forma predeterminada; para acceder a ellos, ejecute `pip install setuptools` en el entorno virtual activated.

- Se han eliminado los módulos `asynchat`, `asyncore` y `imp`, junto con varios `unittest.TestCase` method aliases.

## Nuevas características

### PEP 695: Sintaxis de parámetro de tipo

Las clases y funciones genéricas en PEP 484 se declararon utilizando una sintaxis detallada que dejaba el alcance de los parámetros de tipo poco claro y requería declaraciones explícitas de variación.

PEP 695 presenta una forma nueva, más compacta y explícita de crear generic classes y functions:

    def max[T](args: Iterable[T]) -> T:
        ...

    class list[T]:
        def __getitem__(self, index: int, /) -> T:
            ...

        def append(self, element: T) -> None:
            ...

Además, el PEP introduce una nueva forma de declarar type aliases utilizando la declaración `type`, que crea una instancia de `TypeAliasType`:

    type Point = tuple[float, float]

Los alias de tipo también pueden ser generic:

    type Point[T] = tuple[T, T]

La nueva sintaxis permite declarar los parámetros `TypeVarTuple` y `ParamSpec`, así como los parámetros `TypeVar` con límites o restricciones:

    type IntFunc[**P] = Callable[P, int]  # ParamSpec
    type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
    type HashableSequence[T: Hashable] = Sequence[T]  # TypeVar with bound
    type IntOrStrSequence[T: (int, str)] = Sequence[T]  # TypeVar with constraints

El valor de los alias de tipo y los límites y restricciones de las variables de tipo creadas mediante esta sintaxis se evalúan solo según demanda (consulte lazy evaluation). Esto significa que los alias de tipo pueden hacer referencia a otros tipos definidos más adelante en el archivo.

Los parámetros de tipo declarados a través de una lista de parámetros de tipo son visibles dentro del alcance de la declaración y de cualquier alcance anidado, pero no en el alcance externo. Por ejemplo, se pueden utilizar en las anotaciones de tipo de los métodos de una clase genérica o en el cuerpo de la clase. Sin embargo, no se pueden utilizar en el alcance del módulo una vez definida la clase. Consulte Listas de tipo parámetro para obtener una descripción detallada de la semántica de tiempo de ejecución de los parámetros de tipo.

Para respaldar esta semántica de alcance, se introduce un nuevo tipo de alcance, el annotation scope. Los ámbitos de anotación se comportan en su mayor parte como ámbitos de función, pero interactúan de manera diferente con los ámbitos de clase adjuntos. En Python 3.13, annotations también se evaluará en ámbitos de anotación.

Consulte PEP 695 para obtener más detalles.

(PEP escrito por Eric Traut. Implementación por Jelle Zijlstra, Eric Traut y otros en gh-103764.)

### PEP 701: Formalización sintáctica de cadenas f

PEP 701 elimina algunas restricciones sobre el uso de f-strings. Los componentes de expresión dentro de cadenas f ahora pueden ser cualquier expresión Python válida, incluidas cadenas que reutilizan la misma comilla que la cadena f que las contiene, expresiones de varias líneas, comentarios, barras invertidas y secuencias de escape Unicode. Cubramos estos en detalle:

- Reutilización de comillas: en Python 3.11, reutilizar las mismas comillas que la cadena f adjunta genera un `SyntaxError`, lo que obliga al usuario a usar otras comillas disponibles (como usar comillas dobles o triples si la cadena f usa comillas simples). En Python 3.12, ahora puedes hacer cosas como esta:

      >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
      >>> f"This is the playlist: {", ".join(songs)}"
      'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

  Tenga en cuenta que antes de este cambio no había un límite explícito en cómo se pueden anidar las cadenas f, pero el hecho de que las comillas de cadena no se pueden reutilizar dentro del componente de expresión de las cadenas f hacía imposible anidar cadenas f arbitrariamente. De hecho, esta es la cadena f más anidada que podría escribirse:

      >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
      '2'

  Como ahora las cadenas f pueden contener cualquier expresión Python válida dentro de los componentes de expresión, ahora es posible anidar cadenas f de forma arbitraria:

      >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
      '2'

- Expresiones y comentarios de varias líneas: en Python 3.11, las expresiones de cadena f deben definirse en una sola línea, incluso si la expresión dentro de la cadena f normalmente podría abarcar varias líneas (como listas literales que se definen en varias líneas), lo que las hace más difícil de leer. En Python 3.12 ahora puedes definir cadenas f que abarquen varias líneas y agregar comentarios en línea:

      >>> f"This is the playlist: {", ".join([
      ...     'Take me back to Eden',  # My, my, those eyes like fire
      ...     'Alkaline',              # Not acid nor alkaline
      ...     'Ascensionism'           # Take to the broken skies at last
      ... ])}"
      'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'

- Barras invertidas y caracteres Unicode: antes de Python 3.12, las expresiones de cadena f no podían contener ningún carácter `\`. Esto también afectó a Unicode escape sequences (como `\N{snowman}`), ya que contienen la parte `\N` que anteriormente no podía ser parte de los componentes de expresión de f-strings. Ahora puedes definir expresiones como esta:

      >>> print(f"This is the playlist: {"\n".join(songs)}")
      This is the playlist: Take me back to Eden
      Alkaline
      Ascensionism
      >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
      This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism

Consulte PEP 701 para obtener más detalles.

As a positive side-effect of how this feature has been implemented (by parsing f-strings with the PEG parser), now error messages for f-strings are more precise and include the exact location of the error. For example, in Python 3.11, the following f-string raises a `SyntaxError`:

    >>> my_string = f"{x z y}" + f"{1 + 1}"
      File "<stdin>", line 1
        (x z y)
         ^^^
    SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

pero el mensaje de error no incluye la ubicación exacta del error dentro de la línea y también tiene la expresión artificialmente entre paréntesis. En Python 3.12, a medida que las cadenas f se analizan con el analizador PEG, los mensajes de error pueden ser más precisos y mostrar la línea completa:

    >>> my_string = f"{x z y}" + f"{1 + 1}"
      File "<stdin>", line 1
        my_string = f"{x z y}" + f"{1 + 1}"
                       ^^^
    SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Aportado por Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes y Marta Gómez en gh-102856. PEP escrito por Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou y Marta Gómez).

### PEP 684: un GIL por intérprete

PEP 684 introduce un GIL por intérprete, de modo que ahora se pueden crear subintérpretes con un GIL único por intérprete. Esto permite que los programas Python aprovechen al máximo múltiples núcleos de CPU. Actualmente, esto solo está disponible a través de C-API, aunque una API de Python es anticipada para 3.13.

Use the new `Py_NewInterpreterFromConfig()` function to create an interpreter with its own GIL:

    PyInterpreterConfig config = {
        .check_multi_interp_extensions = 1,
        .gil = PyInterpreterConfig_OWN_GIL,
    };
    PyThreadState *tstate = NULL;
    PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
    if (PyStatus_Exception(status)) {
        return -1;
    }
    /* The new interpreter is now active in the current thread. */

Para obtener más ejemplos de cómo utilizar C-API para subintérpretes con un GIL por intérprete, consulte Modules/_xxsubinterpretersmodule.c.

(Aportado por Eric Snow en gh-104210, etc.)

### PEP 669: Monitoreo de bajo impacto para CPython

PEP 669 define un nuevo `API` para perfiladores, depuradores y otras herramientas para monitorear eventos en CPython. Cubre una amplia gama de eventos, incluidas llamadas, devoluciones, líneas, excepciones, saltos y más. Esto significa que solo paga por lo que usa, brindando soporte para depuradores generales y herramientas de cobertura casi nulos. Consulte `sys.monitoring` para obtener más detalles.

(Aportado por Mark Shannon en gh-103082.)

### PEP 688: Hacer accesible el protocolo de búfer en Python

PEP 688 presenta una forma de utilizar buffer protocol desde el código Python. Las clases que implementan el método `__buffer__()` ahora se pueden utilizar como tipos de búfer.

El nuevo `collections.abc.Buffer` ABC proporciona una forma estándar de representar objetos de búfer, por ejemplo en anotaciones de tipo. La nueva enumeración `inspect.BufferFlags` representa los indicadores que se pueden usar para personalizar la creación del búfer. (Aportado por Jelle Zijlstra en gh-102500.)

### PEP 709: Integración de la comprensión

Las comprensiones de diccionario, lista y conjunto ahora están integradas, en lugar de crear un nuevo objeto de función de un solo uso para cada ejecución de la comprensión. Esto acelera la ejecución de una comprensión hasta dos veces. Consulte PEP 709 para obtener más detalles.

Las variables de iteración de comprensión permanecen aisladas y no sobrescriben una variable del mismo nombre en el alcance externo, ni son visibles después de la comprensión. La incorporación da como resultado algunos cambios de comportamiento visibles:

- Ya no hay un marco separado para la comprensión en los rastreos, y el rastreo/elaboración de perfiles ya no muestra la comprensión como una llamada a función.

- El módulo `symtable` ya no producirá tablas de símbolos secundarios para cada comprensión; en cambio, los locales de comprensión se incluirán en la tabla de símbolos de la función principal.

- Llamar a `locals()` dentro de una comprensión ahora incluye variables externas a la comprensión y ya no incluye la variable sintética `.0` para el «argumento» de comprensión.

- Una comprensión que itera directamente sobre `locals()` (por ejemplo, `[k for k in locals()]`) puede ver «RuntimeError: el diccionario cambió de tamaño durante la iteración» cuando se ejecuta bajo seguimiento (por ejemplo, medición de cobertura de código). Este es el mismo comportamiento que ya se ha visto, por ejemplo, en `for k in locals():`. Para evitar el error, primero cree una lista de claves para iterar: `keys = list(locals()); [k for k in keys]`.

(Aportado por Carl Meyer y Vladimir Matveev en PEP 709.)

### Mensajes de error mejorados

- Ahora se sugieren potencialmente módulos de la biblioteca estándar como parte de los mensajes de error que muestra el intérprete cuando un `NameError` se eleva al nivel superior. (Aportado por Pablo Galindo en gh-98254.)

      >>> sys.version_info
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      NameError: name 'sys' is not defined. Did you forget to import 'sys'?

- Mejora la sugerencia de error para excepciones `NameError` para instancias. Ahora, si se genera un `NameError` en un método y la instancia tiene un atributo que es exactamente igual al nombre en la excepción, la sugerencia incluirá `self.<NAME>` en lugar de la coincidencia más cercana en el alcance del método. (Aportado por Pablo Galindo en gh-99139.)

      >>> class A:
      ...    def __init__(self):
      ...        self.blech = 1
      ...
      ...    def foo(self):
      ...        somethin = blech
      ...
      >>> A().foo()
      Traceback (most recent call last):
        File "<stdin>", line 1
          somethin = blech
                     ^^^^^
      NameError: name 'blech' is not defined. Did you mean: 'self.blech'?

- Mejora el mensaje de error `SyntaxError` cuando el usuario escribe `import x from y` en lugar de `from y import x`. (Aportado por Pablo Galindo en gh-98931.)

      >>> import a.y.z from b.y.z
      Traceback (most recent call last):
        File "<stdin>", line 1
          import a.y.z from b.y.z
          ^^^^^^^^^^^^^^^^^^^^^^^
      SyntaxError: Did you mean to use 'from ... import ...' instead?

- Las excepciones `ImportError` generadas por sentencias `from <module> import <name>` fallidas ahora incluyen sugerencias para el valor de `<name>` según los nombres disponibles en `<module>`. (Aportado por Pablo Galindo en gh-91058.)

      >>> from collections import chainmap
      Traceback (most recent call last):
        File "<stdin>", line 1, in <module>
      ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?

## Nuevas funciones relacionadas con las sugerencias de escritura

Esta sección cubre los cambios principales que afectan a type hints y al módulo `typing`.

### PEP 692: uso de `TypedDict` para una escritura `**kwargs` más precisa

Escribir `**kwargs` en una firma de función introducida por PEP 484 permitía anotaciones válidas solo en los casos en que todos los `**kwargs` eran del mismo tipo.

PEP 692 especifica una forma más precisa de escribir `**kwargs` basándose en diccionarios escritos:

    from typing import TypedDict, Unpack

    class Movie(TypedDict):
      name: str
      year: int

    def foo(**kwargs: Unpack[Movie]): ...

Consulte PEP 692 para obtener más detalles.

(Aportado por Franek Magiera en gh-103629.)

### PEP 698: Decorador override para escritura estática

Se ha agregado un nuevo decorador `typing.override()` al módulo `typing`. Indica a los inspectores de tipo que el método está destinado a anular un método en una superclase. Esto permite a los verificadores de tipos detectar errores cuando un método destinado a anular algo en una clase base en realidad no lo hace.

Ejemplo:

    from typing import override

    class Base:
      def get_color(self) -> str:
        return "blue"

    class GoodChild(Base):
      @override  # ok: overrides Base.get_color
      def get_color(self) -> str:
        return "yellow"

    class BadChild(Base):
      @override  # type checker error: does not override Base.get_color
      def get_colour(self) -> str:
        return "red"

Consulte PEP 698 para obtener más detalles.

(Aportado por Steven Troxler en gh-101561.)

## Otros cambios del lenguaje

- El analizador ahora genera `SyntaxError` al analizar el código fuente que contiene bytes nulos. (Aportado por Pablo Galindo en gh-96670.)

- Un par de caracteres de barra invertida que no es una secuencia de escape válida ahora genera un `SyntaxWarning`, en lugar de `DeprecationWarning`. Por ejemplo, `re.compile("\d+\.\d+")` ahora emite un `SyntaxWarning` (`"\d"` es una secuencia de escape no válida; utilice cadenas sin formato para la expresión regular: `re.compile(r"\d+\.\d+")`). En una versión futura de Python, eventualmente se generará `SyntaxError`, en lugar de `SyntaxWarning`. (Aportado por Victor Stinner en gh-98401.)

- Los escapes octales con un valor mayor que `0o377` (por ejemplo, `"\477"`), obsoletos en Python 3.11, ahora producen un `SyntaxWarning`, en lugar de `DeprecationWarning`. En una futura versión de Python, eventualmente serán un `SyntaxError`. (Aportado por Victor Stinner en gh-98401.)

- Las variables utilizadas en la parte de destino de las comprensiones que no están almacenadas ahora se pueden usar en expresiones de asignación (`:=`). Por ejemplo, en `[(b := 1) for a, b.prop in some_iter]`, ahora se permite la asignación a `b`. Tenga en cuenta que la asignación de variables almacenadas en la parte de destino de las comprensiones (como `a`) todavía no está permitida, según PEP 572. (Aportado por Nikita Sobolev en gh-100581.)

- Las excepciones generadas en el método `__set_name__` de una clase o tipo ya no están incluidas en un `RuntimeError`. La información de contexto se agrega a la excepción como una nota PEP 678. (Aportado por Irit Katriel en gh-77757.)

- Cuando una construcción `try-except*` maneja todo el `ExceptionGroup` y genera otra excepción, esa excepción ya no está incluida en un `ExceptionGroup`. También cambió en la versión 3.11.4. (Aportado por Irit Katriel en gh-103590.)

- El recolector de basura ahora se ejecuta solo en el mecanismo de interrupción de evaluación del ciclo de evaluación del código de bytes de Python en lugar de en las asignaciones de objetos. El GC también se puede ejecutar cuando se llama a `PyErr_CheckSignals()`, por lo que las extensiones C que necesitan ejecutarse durante un período prolongado sin ejecutar ningún código Python también tienen la posibilidad de ejecutar el GC periódicamente. (Aportado por Pablo Galindo en gh-97922.)

- Todos los invocables integrados y de extensión que esperan parámetros booleanos ahora aceptan argumentos de cualquier tipo en lugar de solo `bool` y `int`. (Contribución de Serhiy Storchaka en gh-60203.)

- `memoryview` ahora admite el tipo medio flotante (el código de formato «e»). (Contribución de Donghee Na y Antoine Pitrou en gh-90751.)

- Los objetos `slice` ahora son hasheables, lo que permite usarlos como claves de dictado y elementos de configuración. (Contribución de Will Bradshaw, Furkan Onder y Raymond Hettinger en gh-101264.)

- `sum()` ahora utiliza la suma de Neumaier para mejorar la precisión y la conmutatividad al sumar flotantes o enteros y flotantes mixtos. (Aportado por Raymond Hettinger en gh-100425.)

- `ast.parse()` ahora genera `SyntaxError` en lugar de `ValueError` al analizar el código fuente que contiene bytes nulos. (Aportado por Pablo Galindo en gh-96670.)

- Los métodos de extracción en `tarfile` y `shutil.unpack_archive()` tienen un nuevo argumento, filter, que permite limitar funciones tar que puedan resultar sorprendentes o peligrosas, como la creación de archivos fuera del directorio de destino. Consulte tarfile extraction filters para obtener más detalles. En Python 3.14, el valor predeterminado cambiará a `'data'`. (Aportado por Petr Viktorin en PEP 706.)

- Las instancias `types.MappingProxyType` ahora son hasheables si el mapeo subyacente es hasheable. (Contribución de Serhiy Storchaka en gh-87995.)

- Agregado support for the perf profiler a través de la nueva variable de entorno `PYTHONPERFSUPPORT` y la opción de línea de comandos `-X perf`, así como las nuevas funciones `sys.activate_stack_trampoline()`, `sys.deactivate_stack_trampoline()` y `sys.is_stack_trampoline_active()`. (Diseño de Pablo Galindo. Contribución de Pablo Galindo y Christian Heimes con contribuciones de Gregory P. Smith [Google] y Mark Shannon en gh-96123.)

## Nuevos módulos

- Ninguno.

## Módulos mejorados

### array

- La clase `array.array` ahora admite subíndices, lo que la convierte en generic type. (Aportado por Jelle Zijlstra en gh-98658.)

### asincio

- Se ha mejorado significativamente el rendimiento de escritura en sockets en `asyncio`. `asyncio` ahora evita copias innecesarias al escribir en sockets y usa `sendmsg()` si la plataforma lo admite. (Aportado por Kumar Aditya en gh-91166.)

- Agregado las funciones `asyncio.eager_task_factory()` y `asyncio.create_eager_task_factory()` para permitir la opción de un bucle de eventos para la ejecución de tareas entusiastas, lo que hace que algunos casos de uso sean de 2 a 5 veces más rápidos. (Contribución de Jacob Bower e Itamar Oren en gh-102853, gh-104140 y gh-104138)

- En Linux, `asyncio` usa `asyncio.PidfdChildWatcher` de forma predeterminada si `os.pidfd_open()` está disponible y es funcional en lugar de `asyncio.ThreadedChildWatcher`. (Aportado por Kumar Aditya en gh-98024.)

- El bucle de eventos ahora utiliza el mejor observador de hijos disponible para cada plataforma (`asyncio.PidfdChildWatcher` si es compatible y `asyncio.ThreadedChildWatcher` en caso contrario), por lo que no se recomienda configurar manualmente un observador de hijos. (Aportado por Kumar Aditya en gh-94597.)

- Agregado el parámetro loop_factory a `asyncio.run()` para permitir especificar una fábrica de bucle de eventos personalizada. (Aportado por Kumar Aditya en gh-99388.)

- Agregado la implementación C de `asyncio.current_task()` para una aceleración de 4x-6x. (Aportado por Itamar Oren y Pranav Thulasiram Bhat en gh-100344.)

- `asyncio.iscoroutine()` ahora devuelve `False` para generadores, ya que `asyncio` no admite rutinas heredadas basadas en generadores. (Aportado por Kumar Aditya en gh-102748.)

- `asyncio.wait()` y `asyncio.as_completed()` ahora aceptan generadores que generan tareas. (Aportado por Kumar Aditya en gh-78530.)

### calendar

- Agregado las enumeraciones `calendar.Month` y `calendar.Day` que definen los meses del año y los días de la semana. (Aportado por el Príncipe Roshan en gh-103636.)

### csv

- Agregado indicadores `csv.QUOTE_NOTNULL` y `csv.QUOTE_STRINGS` para proporcionar un control más detallado de `None` y cadenas vacías por objetos `csv.writer`.

### dis

- Los códigos de operación de pseudoinstrucción (que son utilizados por el compilador pero que no aparecen en el código de bytes ejecutable) ahora están expuestos en el módulo `dis`. `HAVE_ARGUMENT` sigue siendo relevante para códigos de operación reales, pero no es útil para pseudoinstrucciones. Utilice la nueva colección `dis.hasarg` en su lugar. (Aportado por Irit Katriel en gh-94216.)

- Agregado la colección `dis.hasexc` para indicar instrucciones que establecen un controlador de excepciones. (Aportado por Irit Katriel en gh-94216.)

### fractions

- Los objetos de tipo `fractions.Fraction` ahora admiten formato de estilo flotante. (Aportado por Mark Dickinson en gh-100161.)

### importlib.resources

- `importlib.resources.as_file()` ahora admite directorios de recursos. (Aportado por Jason R. Coombs en gh-97930.)

- Rename first parameter of `importlib.resources.files()` to anchor. (Contributed by Jason R. Coombs in gh-100598.)

### inspect

- Add `inspect.markcoroutinefunction()` to mark sync functions that return a coroutine for use with `inspect.iscoroutinefunction()`. (Contributed by Carlton Gibson in gh-99247.)

- Agregado `inspect.getasyncgenstate()` y `inspect.getasyncgenlocals()` para determinar el estado actual de los generadores asíncronos. (Aportado por Thomas Krennwallner en gh-79940.)

- The performance of `inspect.getattr_static()` has been considerably improved. Most calls to the function should be at least 2x faster than they were in Python 3.11. (Contributed by Alex Waygood in gh-103193.)

### itertools

- Add `itertools.batched()` for collecting into even-sized tuples where the last batch may be shorter than the rest. (Contributed by Raymond Hettinger in gh-98363.)

### math

- Agregado `math.sumprod()` para calcular una suma de productos. (Aportado por Raymond Hettinger en gh-100485.)

- Extend `math.nextafter()` to include a steps argument for moving up or down multiple steps at a time. (Contributed by Matthias Goergens, Mark Dickinson, and Raymond Hettinger in gh-94906.)

### os

- Agregado `os.PIDFD_NONBLOCK` para abrir un descriptor de archivo para un proceso con `os.pidfd_open()` en modo sin bloqueo. (Aportado por Kumar Aditya en gh-93312.)

- `os.DirEntry` ahora incluye un método `os.DirEntry.is_junction()` para verificar si la entrada es un cruce. (Aportado por Charles Machalow en gh-99547.)

- Agregado funciones `os.listdrives()`, `os.listvolumes()` y `os.listmounts()` en Windows para enumerar unidades, volúmenes y puntos de montaje. (Aportado por Steve Dower en gh-102519.)

- `os.stat()` y `os.lstat()` ahora son más precisos en Windows. El campo `st_birthtime` ahora se completará con la hora de creación del archivo, y `st_ctime` está obsoleto pero aún contiene la hora de creación (pero en el futuro devolverá el último cambio de metadatos, para mantener la coherencia con otras plataformas). `st_dev` puede tener hasta 64 bits y `st_ino` hasta 128 bits dependiendo de su sistema de archivos, y `st_rdev` siempre está configurado en cero en lugar de valores incorrectos. Ambas funciones pueden ser significativamente más rápidas en las versiones más recientes de Windows. (Aportado por Steve Dower en gh-99726.)

- As of 3.12.4, `os.mkdir()` and `os.makedirs()` on Windows now support passing a mode value of `0o700` to apply access control to the new directory. This implicitly affects `tempfile.mkdtemp()` and is a mitigation for CVE 2024-4030. Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486.)

### os.path

- Agregado `os.path.isjunction()` para verificar si una ruta determinada es un cruce. (Aportado por Charles Machalow en gh-99547.)

- Agregado `os.path.splitroot()` para dividir una ruta en una tríada `(drive, root, tail)`. (Aportado por Barney Gale en gh-101000.)

### pathlib

- Agregado soporte para subclasificar `pathlib.PurePath` y `pathlib.Path`, además de sus variantes específicas de Posix y Windows. Las subclases pueden anular el método `pathlib.PurePath.with_segments()` para pasar información entre instancias de ruta.

- Agregado `pathlib.Path.walk()` para recorrer los árboles de directorios y generar todos los nombres de archivos o directorios dentro de ellos, similar a `os.walk()`. (Aportado por Stanislav Zmiev en gh-90385.)

- Agregado el parámetro opcional walk_up a `pathlib.PurePath.relative_to()` para permitir la inserción de entradas `..` en el resultado; este comportamiento es más consistente con `os.path.relpath()`. (Aportado por Domenico Ragusa en gh-84538.)

- Agregado `pathlib.Path.is_junction()` como proxy a `os.path.isjunction()`. (Aportado por Charles Machalow en gh-99547.)

- Agregado el parámetro opcional case_sensitive a `pathlib.Path.glob()`, `pathlib.Path.rglob()` y `pathlib.PurePath.match()` para hacer coincidir la distinción entre mayúsculas y minúsculas de la ruta, lo que permite un control más preciso sobre el proceso de coincidencia.

### platform

- Add support for detecting Windows 11 and Windows Server releases past 2012. Previously, lookups on Windows Server platforms newer than Windows Server 2012 and on Windows 11 would return `Windows-10`. (Contributed by Steve Dower in gh-89545.)

### pbd

- Agregado variables convenientes para mantener valores temporalmente para la sesión de depuración y proporcionar acceso rápido a valores como el marco actual o el valor de retorno. (Aportado por Tian Gao en gh-103693.)

### random

- Agregado `random.binomialvariate()`. (Aportado por Raymond Hettinger en gh-81620.)

- Agregado un valor predeterminado de `lambd=1.0` a `random.expovariate()`. (Aportado por Raymond Hettinger en gh-100234.)

### shutil

- `shutil.make_archive()` ahora pasa el argumento root_dir a archivadores personalizados que lo admiten. En este caso, ya no cambia temporalmente el directorio de trabajo actual del proceso a root_dir para realizar el archivado. (Aportado por Serhiy Storchaka en gh-74696.)

- `shutil.rmtree()` now accepts a new argument onexc which is an error handler like onerror but which expects an exception instance rather than a (typ, val, tb) triplet. onerror is deprecated. (Contributed by Irit Katriel in gh-102828.)

- `shutil.which()` ahora consulta la variable de entorno PATHEXT para encontrar coincidencias dentro de PATH en Windows incluso cuando el cmd dado incluye un componente de directorio. (Aportado por Charles Machalow en gh-103179.)

  `shutil.which()` llamará a `NeedCurrentDirectoryForExePathW` cuando solicite ejecutables en Windows para determinar si el directorio de trabajo actual debe anteponerse a la ruta de búsqueda. (Aportado por Charles Machalow en gh-103179.)

  `shutil.which()` devolverá una ruta que coincida con cmd con un componente de `PATHEXT` antes de una coincidencia directa en otra parte de la ruta de búsqueda en Windows. (Aportado por Charles Machalow en gh-103179.)

### sqlite3

- Agregado un command-line interface. (Aportado por Erlend E. Aasland en gh-77617.)

- Agregado el atributo `sqlite3.Connection.autocommit` a `sqlite3.Connection` y el parámetro autocommit a `sqlite3.connect()` para controlar transaction handling compatible con PEP 249. (Aportado por Erlend E. Aasland en gh-83638.)

- Agregado el parámetro de solo palabra clave entrypoint a `sqlite3.Connection.load_extension()`, para anular el punto de entrada de la extensión SQLite. (Aportado por Erlend E. Aasland en gh-103015.)

- Agregado `sqlite3.Connection.getconfig()` y `sqlite3.Connection.setconfig()` a `sqlite3.Connection` para realizar cambios de configuración en una conexión de base de datos. (Aportado por Erlend E. Aasland en gh-103489.)

### statistics

- Se extendió `statistics.correlation()` para incluirlo como método `ranked` para calcular la correlación de Spearman de datos clasificados. (Aportado por Raymond Hettinger en gh-95861.)

### sys

- Agregado el espacio de nombres `sys.monitoring` para exponer la nueva API de supervisión PEP 669. (Aportado por Mark Shannon en gh-103082.)

- Agregado `sys.activate_stack_trampoline()` y `sys.deactivate_stack_trampoline()` para activar y desactivar los trampolines del perfilador de pila, y `sys.is_stack_trampoline_active()` para consultar si los trampolines del perfilador de pila están activos. (Contribuido por Pablo Galindo y Christian Heimes con contribuciones de Gregory P. Smith [Google] y Mark Shannon en gh-96123.)

- Agregado `sys.last_exc` que contiene la última excepción no controlada que se generó (para casos de uso de depuración post-mortem). Deje obsoletos los tres campos que tienen la misma información en su formato heredado: `sys.last_type`, `sys.last_value` y `sys.last_traceback`. (Aportado por Irit Katriel en gh-102778.)

- `sys._current_exceptions()` ahora devuelve una asignación de thread-id a una instancia de excepción, en lugar de a una tupla `(typ, exc, tb)`. (Aportado por Irit Katriel en gh-103176.)

- `sys.setrecursionlimit()` y `sys.getrecursionlimit()`. El límite de recursividad ahora se aplica sólo al código Python. Las funciones integradas no utilizan el límite de recursividad, pero están protegidas por un mecanismo diferente que evita que la recursividad provoque un fallo de la máquina virtual.

### tempfile

- La función `tempfile.NamedTemporaryFile` tiene un nuevo parámetro opcional delete_on_close (Aportado por Evgeny Zorin en gh-58451.)

- `tempfile.mkdtemp()` ahora siempre devuelve una ruta absoluta, incluso si el argumento proporcionado al parámetro dir es una ruta relativa.

- As of 3.12.4 on Windows, the default mode `0o700` used by `tempfile.mkdtemp()` now limits access to the new directory due to changes to `os.mkdir()`. This is a mitigation for CVE 2024-4030. (Contributed by Steve Dower in gh-118486.)

### threading

- Agregado `threading.settrace_all_threads()` y `threading.setprofile_all_threads()` que permiten configurar funciones de seguimiento y creación de perfiles en todos los hilos en ejecución además del que realiza la llamada. (Aportado por Pablo Galindo en gh-93503.)

### tkinter

- `tkinter.Canvas.coords()` ahora aplana sus argumentos. Ahora acepta no sólo coordenadas como argumentos separados (`x1, y1, x2, y2, ...`) y una secuencia de coordenadas (`[x1, y1, x2, y2, ...]`), sino también coordenadas agrupadas en pares (`(x1, y1), (x2, y2), ...` y `[(x1, y1), (x2, y2), ...]`), como los métodos `create_*()`. (Aportado por Serhiy Storchaka en gh-94473.)

### tokenize

- El módulo `tokenize` incluye los cambios introducidos en PEP 701. (Aportado por Marta Gómez Macías y Pablo Galindo en gh-102856.) Consulte Portar a Python 3.12 para obtener más información sobre los cambios en el módulo `tokenize`.

### types

- Agregado `types.get_original_bases()` para permitir una mayor introspección de Tipos genéricos definidos por el usuario cuando esté subclasificado. (Contribución de James Hilton-Balfe y Alex Waygood en gh-101827.)

### typing

- Las comprobaciones de `isinstance()` con `runtime-checkable protocols` ahora usan `inspect.getattr_static()` en lugar de `hasattr()` para buscar si existen atributos. Esto significa que los descriptores y los métodos `__getattr__()` ya no se evalúan inesperadamente durante las comprobaciones de `isinstance()` con protocolos verificables en tiempo de ejecución. Sin embargo, también puede significar que algunos objetos que solían considerarse instancias de un protocolo verificable en tiempo de ejecución ya no se consideran instancias de ese protocolo en Python 3.12+, y viceversa. Es poco probable que la mayoría de los usuarios se vean afectados por este cambio. (Contribuido por Alex Waygood en gh-102433.)

- Los miembros de un protocolo verificable en tiempo de ejecución ahora se consideran «congelados» en tiempo de ejecución tan pronto como se crea la clase. La aplicación de parches de atributos en un protocolo verificable en tiempo de ejecución seguirá funcionando, pero no tendrá ningún impacto en las comprobaciones `isinstance()` que comparan objetos con el protocolo. Por ejemplo:

      >>> from typing import Protocol, runtime_checkable
      >>> @runtime_checkable
      ... class HasX(Protocol):
      ...     x = 1
      ...
      >>> class Foo: ...
      ...
      >>> f = Foo()
      >>> isinstance(f, HasX)
      False
      >>> f.x = 1
      >>> isinstance(f, HasX)
      True
      >>> HasX.y = 2
      >>> isinstance(f, HasX)  # unchanged, even though HasX now also has a "y" attribute
      True

  Este cambio se realizó para acelerar las comprobaciones de `isinstance()` en protocolos verificables en tiempo de ejecución.

- The performance profile of `isinstance()` checks against `runtime-checkable protocols` has changed significantly. Most `isinstance()` checks against protocols with only a few members should be at least 2x faster than in 3.11, and some may be 20x faster or more. However, `isinstance()` checks against protocols with many members may be slower than in Python 3.11. (Contributed by Alex Waygood in gh-74690 and gh-103193.)

- Todas las clases `typing.TypedDict` y `typing.NamedTuple` ahora tienen el atributo `__orig_bases__`. (Aportado por Adrián García Badaracco en gh-103699.)

- Agregado el parámetro `frozen_default` a `typing.dataclass_transform()`. (Aportado por Erik De Bonte en gh-99957.)

### unicodedata

- La base de datos Unicode se ha actualizado a la versión 15.0.0. (Aportado por Benjamin Peterson en gh-96734).

### unittest

Agregado una opción de línea de comando `--durations`, que muestra los N casos de prueba más lentos:

    python3 -m unittest --durations=3 lib.tests.test_threading
    .....
    Slowest test durations
    ----------------------------------------------------------------------
    1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
    1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
    0.518s     test_timeout (Lib.test.test_threading.EventTests)

    (0.000 durations hidden.  Use -v to show these durations.)
    ----------------------------------------------------------------------
    Ran 158 tests in 9.869s

    OK (skipped=3)

(Aportado por Giampaolo Rodola en gh-48330)

### uuid

- Agregado un command-line interface. (Aportado por Adam Chhina en gh-88597.)

## Optimizaciones

- Elimine los miembros `wstr` y `wstr_length` de los objetos Unicode. Reduce el tamaño del objeto en 8 o 16 bytes en una plataforma de 64 bits. (PEP 623) (Aportado por Inada Naoki en gh-92536.)

- Agregado soporte experimental para usar el optimizador binario BOLT en el proceso de compilación, lo que mejora el rendimiento entre un 1% y un 5%. (Contribuido por Kevin Modzelewski en gh-90536 y sintonizado por Donghee Na en gh-101525)

- Acelere la sustitución de expresiones regulares (funciones `re.sub()` y `re.subn()` y los métodos `re.Pattern` correspondientes) para cadenas de reemplazo que contienen referencias de grupo entre 2 y 3 veces. (Aportado por Serhiy Storchaka en gh-91524.)

- Acelere la creación de `asyncio.Task` aplazando el costoso formato de cadenas. (Aportado por Itamar Oren en gh-103793.)

- Las funciones `tokenize.tokenize()` y `tokenize.generate_tokens()` son hasta un 64 % más rápidas como efecto secundario de los cambios necesarios para cubrir PEP 701 en el módulo `tokenize`. (Aportado por Marta Gómez Macías y Pablo Galindo en gh-102856.)

- Acelere las llamadas al método `super()` y las cargas de atributos mediante la nueva instrucción `LOAD_SUPER_ATTR`. (Contribución de Carl Meyer y Vladimir Matveev en gh-103497.)

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

- Elimine la instrucción `LOAD_METHOD`. Se ha fusionado con `LOAD_ATTR`. `LOAD_ATTR` ahora se comportará como la antigua instrucción `LOAD_METHOD` si el bit bajo de su oparg está configurado. (Contribuido por Ken Jin en gh-93429.)

- Elimine las instrucciones `JUMP_IF_FALSE_OR_POP` y `JUMP_IF_TRUE_OR_POP`. (Aportado por Irit Katriel en gh-102859.)

- Elimine la instrucción `PRECALL`. (Aportado por Mark Shannon en gh-92925.)

- Agregado las instrucciones `BINARY_SLICE` y `STORE_SLICE`. (Aportado por Mark Shannon en gh-94163.)

- Agregado las instrucciones `CALL_INTRINSIC_1`. (Aportado por Mark Shannon en gh-99005.)

- Agregado la instrucción `CALL_INTRINSIC_2`. (Aportado por Irit Katriel en gh-101799.)

- Agregado la instrucción `CLEANUP_THROW`. (Aportado por Brandt Bucher en gh-90997.)

- Agregado la instrucción `END_SEND`. (Aportado por Mark Shannon en gh-103082.)

- Agregada la instrucción `LOAD_FAST_AND_CLEAR` como parte de la implementación de PEP 709. (Aportado por Carl Meyer en gh-101441.)

- Agregado la instrucción `LOAD_FAST_CHECK`. (Aportado por Dennis Sweeney en gh-93143.)

- Agregado los códigos de operación `LOAD_FROM_DICT_OR_DEREF`, `LOAD_FROM_DICT_OR_GLOBALS` y `LOAD_LOCALS` como parte de la implementación de PEP 695. Elimine el código de operación `LOAD_CLASSDEREF`, que se puede reemplazar con `LOAD_LOCALS` más `LOAD_FROM_DICT_OR_DEREF`. (Aportado por Jelle Zijlstra en gh-103764.)

- Agregado la instrucción `LOAD_SUPER_ATTR`. (Contribución de Carl Meyer y Vladimir Matveev en gh-103497.)

- Agregado la instrucción `RETURN_CONST`. (Aportado por Wenyang Wang en gh-101632.)

## Demostraciones y herramientas

- Elimine el directorio `Tools/demo/` que contenía scripts de demostración antiguos. Se puede encontrar una copia en el old-demos project. (Aportado por Victor Stinner en gh-97681.)

- Elimine los scripts de ejemplo obsoletos del directorio `Tools/scripts/`. Se puede encontrar una copia en el old-demos project. (Aportado por Victor Stinner en gh-97669.)

## Obsoleto

- `argparse`: Los parámetros type, choices y metavar de `argparse.BooleanOptionalAction` están obsoletos y se eliminarán en 3.14. (Contribución de Nikita Sobolev en gh-92248.)

- `ast`: las siguientes características de `ast` han quedado obsoletas en la documentación desde Python 3.8, ahora provocan que se emita un `DeprecationWarning` en tiempo de ejecución cuando se accede a ellas o se usan, y se eliminarán en Python 3.14:

  - `ast.Num`

  - `ast.Str`

  - `ast.Bytes`

  - `ast.NameConstant`

  - `ast.Ellipsis`

  Utilice `ast.Constant` en su lugar. (Aportado por Serhiy Storchaka en gh-90953.)

- `asyncio`:

  - Las clases de vigilancia secundaria `asyncio.MultiLoopChildWatcher`, `asyncio.FastChildWatcher`, `asyncio.AbstractChildWatcher` y `asyncio.SafeChildWatcher` están en desuso y se eliminarán en Python 3.14. (Aportado por Kumar Aditya en gh-94597.)

  - `asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` y `asyncio.AbstractEventLoopPolicy.get_child_watcher()` están en desuso y se eliminarán en Python 3.14. (Aportado por Kumar Aditya en gh-94597.)

  - El método `get_event_loop()` de la política de bucle de eventos predeterminada ahora emite un `DeprecationWarning` si no hay ningún bucle de eventos establecido y decide crear uno. (Contribución de Serhiy Storchaka y Guido van Rossum en gh-100160.)

- `calendar`: las constantes `calendar.January` y `calendar.February` están obsoletas y reemplazadas por `calendar.JANUARY` y `calendar.FEBRUARY`. (Aportado por el Príncipe Roshan en gh-103636.)

- `collections.abc`: `collections.abc.ByteString` en desuso. Prefiere `Sequence` o `collections.abc.Buffer`. Para usar al escribir, prefiera una unión, como `bytes | bytearray` o `collections.abc.Buffer`. (Aportado por Shantanu Jain en gh-91896.)

- `datetime`: `utcnow()` y `utcfromtimestamp()` de `datetime.datetime` están en desuso y se eliminarán en una versión futura. En su lugar, utilice objetos que tengan en cuenta la zona horaria para representar las fechas y horas en UTC: respectivamente, llame a `now()` y `fromtimestamp()` con el parámetro tz establecido en `datetime.UTC`. (Aportado por Paul Ganssle en gh-103857.)

- `email`: obsoleto el parámetro isdst en `email.utils.localtime()`. (Aportado por Alan Williams en gh-72346.)

- `importlib.abc`: Obsoletas las siguientes clases, cuya eliminación está programada en Python 3.14:

  - `importlib.abc.ResourceReader`

  - `importlib.abc.Traversable`

  - `importlib.abc.TraversableResources`

  Utilice clases `importlib.resources.abc` en su lugar:

  - `importlib.resources.abc.Traversable`

  - `importlib.resources.abc.TraversableResources`

  (Contribución de Jason R. Coombs y Hugo van Kemenade en gh-93963.)

- `itertools`: obsoleta la compatibilidad con operaciones de copia, copia profunda y pickle, que no está documentada, es ineficiente, históricamente tiene errores e inconsistente. Esto se eliminará en 3.14 para lograr una reducción significativa en el volumen de código y la carga de mantenimiento. (Aportado por Raymond Hettinger en gh-101588.)

- `multiprocessing`: en Python 3.14, el método de inicio predeterminado de `multiprocessing` cambiará a uno más seguro en Linux, BSD y otras plataformas POSIX que no sean macOS donde `'fork'` es actualmente el predeterminado (gh-84559). Agregar una advertencia de tiempo de ejecución sobre esto se consideró demasiado perjudicial ya que se espera que a la mayoría del código no le importe. Utilice las API `get_context()` o `set_start_method()` para especificar explícitamente cuándo su código requires `'fork'`. Ver contexts and start methods.

- `pkgutil`: `pkgutil.find_loader()` y `pkgutil.get_loader()` están en desuso y se eliminarán en Python 3.14; utilice `importlib.util.find_spec()` en su lugar. (Contribución de Nikita Sobolev en gh-97850.)

- `pty`: el módulo tiene dos funciones `master_open()` y `slave_open()` no documentadas que han quedado obsoletas desde Python 2 pero que solo obtuvieron un `DeprecationWarning` adecuado en 3.12. Elimínelos en 3.14. (Aportado por Soumendra Ganguly y Gregory P. Smith en gh-85984.)

- `os`:

  - Los campos `st_ctime` devueltos por `os.stat()` y `os.lstat()` en Windows están en desuso. En una versión futura, contendrán la hora del último cambio de metadatos, de forma coherente con otras plataformas. Por ahora, todavía contienen la hora de creación, que también está disponible en el nuevo campo `st_birthtime`. (Aportado por Steve Dower en gh-99726.)

  - On POSIX platforms, `os.fork()` can now raise a `DeprecationWarning` when it can detect being called from a multithreaded process. There has always been a fundamental incompatibility with the POSIX platform when doing so. Even if such code appeared to work. We added the warning to raise awareness as issues encountered by code doing this are becoming more frequent. See the `os.fork()` documentation for more details along with this discussion on fork being incompatible with threads for why we’re now surfacing this longstanding platform compatibility problem to developers.

  Cuando aparece esta advertencia debido al uso de `multiprocessing` o `concurrent.futures`, la solución es utilizar un método de inicio de `multiprocessing` diferente, como `"spawn"` o `"forkserver"`.

- `shutil`: The onerror argument of `shutil.rmtree()` is deprecated; use onexc instead. (Contributed by Irit Katriel in gh-102828.)

- `sqlite3`:

  - default adapters and converters ahora están en desuso. En su lugar, utilice el Ejemplos para adaptadores y convertidores y adáptelo a sus necesidades. (Aportado por Erlend E. Aasland en gh-90016.)

  - En `execute()`, `DeprecationWarning` ahora se emite cuando named placeholders se utiliza junto con los parámetros proporcionados como sequence en lugar de como `dict`. A partir de Python 3.14, el uso de marcadores de posición con nombre con parámetros proporcionados como una secuencia generará un `ProgrammingError`. (Aportado por Erlend E. Aasland en gh-101698.)

- `sys`: los campos `sys.last_type`, `sys.last_value` y `sys.last_traceback` están en desuso. Utilice `sys.last_exc` en su lugar. (Aportado por Irit Katriel en gh-102778.)

- `tarfile`: la extracción de archivos tar sin especificar filter está en desuso hasta Python 3.14, cuando el filtro `'data'` se convertirá en el predeterminado. Consulte Extraction filters para obtener más detalles.

- `typing`:

  - `typing.Hashable` and `typing.Sized`, aliases for `collections.abc.Hashable` and `collections.abc.Sized` respectively, are deprecated. (gh-94309.)

  - `typing.ByteString`, en desuso desde Python 3.9, ahora provoca que se emita un `DeprecationWarning` cuando se utiliza. (Aportado por Alex Waygood en gh-91896.)

- `xml.etree.ElementTree`: el módulo ahora emite `DeprecationWarning` al probar el valor de verdad de un `xml.etree.ElementTree.Element`. Antes, la implementación de Python emitía `FutureWarning` y la implementación de C no emitía nada. (Aportado por Jacob Walls en gh-83122.)

- Las firmas de 3 argumentos (tipo, valor, rastreo) de `coroutine throw()`, `generator throw()` y `async generator throw()` están en desuso y es posible que se eliminen en una versión futura de Python. Utilice en su lugar las versiones de un solo argumento de estas funciones. (Aportado por Ofey Chan en gh-89874.)

- `DeprecationWarning` is now raised when `__package__` on a module differs from `__spec__.parent` (previously it was `ImportWarning`). (Contributed by Brett Cannon in gh-65961.)

- Setting `__package__` or `__cached__` on a module is deprecated, and will cease to be set or taken into consideration by the import system in Python 3.14. (Contributed by Brett Cannon in gh-65961.)

- The bitwise inversion operator (`~`) on bool is deprecated. It will throw an error in Python 3.16. Use `not` for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlying `int`, convert to int explicitly: `~int(x)`. (Contributed by Tim Hoffmann in gh-103487.)

- Accessing `co_lnotab` on code objects was deprecated in Python 3.10 via PEP 626, but it only got a proper `DeprecationWarning` in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in gh-101866.)

### Eliminación pendiente en Python 3.13

Módulos (ver PEP 594):

- `aifc`

- `audioop`

- `cgi`

- `cgitb`

- `chunk`

- `crypt`

- `imghdr`

- `mailcap`

- `msilib`

- `nis`

- `nntplib`

- `ossaudiodev`

- `pipes`

- `sndhdr`

- `spwd`

- `sunau`

- `telnetlib`

- `uu`

- `xdrlib`

Otros módulos:

- `lib2to3` y el programa 2to3 (gh-84540)

APIs:

- `configparser.LegacyInterpolation` (gh-90765)

- `locale.resetlocale()` (gh-90817)

- `turtle.RawTurtle.settiltangle()` (gh-50096)

- `unittest.findTestCases()` (gh-50096)

- `unittest.getTestCaseNames()` (gh-50096)

- `unittest.makeSuite()` (gh-50096)

- `unittest.TestProgram.usageExit()` (gh-67048)

- `webbrowser.MacOSX` (gh-86421)

- Encadenamiento de descriptores `classmethod` (gh-89519)

- `importlib.resources` deprecated methods:

  - `contents()`

  - `is_resource()`

  - `open_binary()`

  - `open_text()`

  - `path()`

  - `read_binary()`

  - `read_text()`

  Use `importlib.resources.files()` instead. Refer to importlib-resources: Migrating from Legacy (gh-106531)

### Eliminación pendiente en Python 3.14

- `argparse`: Los parámetros type, choices y metavar de `argparse.BooleanOptionalAction` están obsoletos y se eliminarán en 3.14. (Contribución de Nikita Sobolev en gh-92248.)

- `ast`: The following features have been deprecated in documentation since Python 3.8, now cause a `DeprecationWarning` to be emitted at runtime when they are accessed or used, and will be removed in Python 3.14:

  - `ast.Num`

  - `ast.Str`

  - `ast.Bytes`

  - `ast.NameConstant`

  - `ast.Ellipsis`

  Utilice `ast.Constant` en su lugar. (Aportado por Serhiy Storchaka en gh-90953.)

- `asyncio`:

  - The child watcher classes `MultiLoopChildWatcher`, `FastChildWatcher`, `AbstractChildWatcher` and `SafeChildWatcher` are deprecated and will be removed in Python 3.14. (Contributed by Kumar Aditya in gh-94597.)

  - `asyncio.set_child_watcher()`, `asyncio.get_child_watcher()`, `asyncio.AbstractEventLoopPolicy.set_child_watcher()` y `asyncio.AbstractEventLoopPolicy.get_child_watcher()` están en desuso y se eliminarán en Python 3.14. (Aportado por Kumar Aditya en gh-94597.)

  - El método `get_event_loop()` de la política de bucle de eventos predeterminada ahora emite un `DeprecationWarning` si no hay ningún bucle de eventos establecido y decide crear uno. (Contribución de Serhiy Storchaka y Guido van Rossum en gh-100160.)

- `collections.abc`: Deprecated `ByteString`. Prefer `Sequence` or `Buffer`. For use in typing, prefer a union, like `bytes | bytearray`, or `collections.abc.Buffer`. (Contributed by Shantanu Jain in gh-91896.)

- `email`: Deprecated the isdst parameter in `email.utils.localtime()`. (Contributed by Alan Williams in gh-72346.)

- `importlib`: `__package__` and `__cached__` will cease to be set or taken into consideration by the import system (gh-97879).

- `importlib.abc` deprecated classes:

  - `importlib.abc.ResourceReader`

  - `importlib.abc.Traversable`

  - `importlib.abc.TraversableResources`

  Utilice clases `importlib.resources.abc` en su lugar:

  - `importlib.resources.abc.Traversable`

  - `importlib.resources.abc.TraversableResources`

  (Contribución de Jason R. Coombs y Hugo van Kemenade en gh-93963.)

- `itertools` had undocumented, inefficient, historically buggy, and inconsistent support for copy, deepcopy, and pickle operations. This will be removed in 3.14 for a significant reduction in code volume and maintenance burden. (Contributed by Raymond Hettinger in gh-101588.)

- `multiprocessing`: The default start method will change to a safer one on Linux, BSDs, and other non-macOS POSIX platforms where `'fork'` is currently the default (gh-84559). Adding a runtime warning about this was deemed too disruptive as the majority of code is not expected to care. Use the `get_context()` or `set_start_method()` APIs to explicitly specify when your code requires `'fork'`. See Contextos y métodos de inicio.

- `pathlib`: `is_relative_to()` and `relative_to()`: passing additional arguments is deprecated.

- `pkgutil`: `find_loader()` and `get_loader()` now raise `DeprecationWarning`; use `importlib.util.find_spec()` instead. (Contributed by Nikita Sobolev in gh-97850.)

- `pty`:

  - `master_open()`: use `pty.openpty()`.

  - `slave_open()`: use `pty.openpty()`.

- `sqlite3`:

  - `version` and `version_info`.

  - `execute()` and `executemany()` if named placeholders are used and parameters is a sequence instead of a `dict`.

- `typing`: `ByteString`, deprecated since Python 3.9, now causes a `DeprecationWarning` to be emitted when it is used.

- `urllib`: `urllib.parse.Quoter` is deprecated: it was not intended to be a public API. (Contributed by Gregory P. Smith in gh-88168.)

### Eliminación pendiente en Python 3.15

- `http.server.CGIHTTPRequestHandler` will be removed along with its related `--cgi` flag to `python -m http.server`. It was obsolete and rarely used. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.

- `importlib`:

  - `load_module()` method: use `exec_module()` instead.

- `locale`: `locale.getdefaultlocale()` was deprecated in Python 3.11 and originally planned for removal in Python 3.13 (gh-90817), but removal has been postponed to Python 3.15. Use `locale.setlocale()`, `locale.getencoding()` and `locale.getlocale()` instead. (Contributed by Hugo van Kemenade in gh-111187.)

- `pathlib`: `pathlib.PurePath.is_reserved()` is deprecated and scheduled for removal in Python 3.15. From Python 3.13 onwards, use `os.path.isreserved` to detect reserved paths on Windows.

- `platform`: `java_ver()` is deprecated and will be removed in 3.15. It was largely untested, had a confusing API, and was only useful for Jython support. (Contributed by Nikita Sobolev in gh-116349.)

- `sysconfig`:

  - The check_home argument of `sysconfig.is_python_build()` has been deprecated since Python 3.12.

- `threading`: Passing any arguments to `threading.RLock()` is now deprecated. C version allows any numbers of args and kwargs, but they are just ignored. Python version does not allow any arguments. All arguments will be removed from `threading.RLock()` in Python 3.15. (Contributed by Nikita Sobolev in gh-102029.)

- `typing.NamedTuple`:

  - The undocumented keyword argument syntax for creating `NamedTuple` classes (`NT = NamedTuple("NT", x=int)`) is deprecated, and will be disallowed in 3.15. Use the class-based syntax or the functional syntax instead.

- `types`:

  - `types.CodeType`: Accessing `co_lnotab` was deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a proper `DeprecationWarning` in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in gh-101866.)

- `typing`:

  - When using the functional syntax to create a `NamedTuple` class, failing to pass a value to the fields parameter (`NT = NamedTuple("NT")`) is deprecated. Passing `None` to the fields parameter (`NT = NamedTuple("NT", None)`) is also deprecated. Both will be disallowed in Python 3.15. To create a `NamedTuple` class with 0 fields, use `class NT(NamedTuple): pass` or `NT = NamedTuple("NT", [])`.

- `typing.TypedDict`: When using the functional syntax to create a `TypedDict` class, failing to pass a value to the fields parameter (`TD = TypedDict("TD")`) is deprecated. Passing `None` to the fields parameter (`TD = TypedDict("TD", None)`) is also deprecated. Both will be disallowed in Python 3.15. To create a `TypedDict` class with 0 fields, use `class TD(TypedDict): pass` or `TD = TypedDict("TD", {})`.

- `wave`: Deprecate the `getmark()`, `setmark()` and `getmarkers()` methods of the `wave.Wave_read` and `wave.Wave_write` classes. They will be removed in Python 3.15. (Contributed by Victor Stinner in gh-105096.)

### Pending Removal in Python 3.16

- The import system:

  - Setting `__loader__` on a module while failing to set `__spec__.loader` is deprecated. In Python 3.16, `__loader__` will cease to be set or taken into consideration by the import system or the standard library.

- `array`: `array.array` `'u'` type (`wchar_t`): use the `'w'` type instead (`Py_UCS4`).

- `builtins`: `~bool`, bitwise inversion on bool.

- `symtable`: Deprecate `symtable.Class.get_methods()` due to the lack of interest. (Contributed by Bénédikt Tran in gh-119698.)

### Eliminación pendiente en versiones futuras

The following APIs will be removed in the future, although there is currently no date scheduled for their removal.

- `argparse`: Nesting argument groups and nesting mutually exclusive groups are deprecated.

- Código de formato `'u'` de `array` (gh-57281)

- `builtins`:

  - `bool(NotImplemented)`.

  - Generators: `throw(type, exc, tb)` and `athrow(type, exc, tb)` signature is deprecated: use `throw(exc)` and `athrow(exc)` instead, the single argument signature.

  - Currently Python accepts numeric literals immediately followed by keywords, for example `0in x`, `1or x`, `0if 1else 2`. It allows confusing and ambiguous expressions like `[0x1for x in y]` (which can be interpreted as `[0x1 for x in y]` or `[0x1f or x in y]`). A syntax warning is raised if the numeric literal is immediately followed by one of keywords `and`, `else`, `for`, `if`, `in`, `is` and `or`. In a future release it will be changed to a syntax error. (gh-87999)

  - Support for `__index__()` and `__int__()` method returning non-int type: these methods will be required to return an instance of a strict subclass of `int`.

  - Support for `__float__()` method returning a strict subclass of `float`: these methods will be required to return an instance of `float`.

  - Support for `__complex__()` method returning a strict subclass of `complex`: these methods will be required to return an instance of `complex`.

  - Delegation of `int()` to `__trunc__()` method.

  - Passing a complex number as the real or imag argument in the `complex()` constructor is now deprecated; it should only be passed as a single positional argument. (Contributed by Serhiy Storchaka in gh-109218.)

- `calendar`: las constantes `calendar.January` y `calendar.February` están obsoletas y reemplazadas por `calendar.JANUARY` y `calendar.FEBRUARY`. (Aportado por el Príncipe Roshan en gh-103636.)

- `codeobject.co_lnotab`: use the `codeobject.co_lines()` method instead.

- `datetime`:

  - `utcnow()`: use `datetime.datetime.now(tz=datetime.UTC)`.

  - `utcfromtimestamp()`: use `datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)`.

- `gettext`: Plural value must be an integer.

- `importlib`:

  - `cache_from_source()` debug_override parameter is deprecated: use the optimization parameter instead.

- `importlib.metadata`:

  - `EntryPoints` tuple interface.

  - Implicit `None` on return values.

- `mailbox`: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.

- `os`: Calling `os.register_at_fork()` in multi-threaded process.

- `pydoc.ErrorDuringImport`: A tuple value for exc_info parameter is deprecated, use an exception instance.

- `re`: More strict rules are now applied for numerical group references and group names in regular expressions. Only sequence of ASCII digits is now accepted as a numerical reference. The group name in bytes patterns and replacement strings can now only contain ASCII letters and digits and underscore. (Contributed by Serhiy Storchaka in gh-91760.)

- `sre_compile`, `sre_constants` and `sre_parse` modules.

- `shutil`: `rmtree()`”s onerror parameter is deprecated in Python 3.12; use the onexc parameter instead.

- `ssl` options and protocols:

  - `ssl.SSLContext` without protocol argument is deprecated.

  - `ssl.SSLContext`: `set_npn_protocols()` and `selected_npn_protocol()` are deprecated: use ALPN instead.

  - `ssl.OP_NO_SSL*` options

  - `ssl.OP_NO_TLS*` options

  - `ssl.PROTOCOL_SSLv3`

  - `ssl.PROTOCOL_TLS`

  - `ssl.PROTOCOL_TLSv1`

  - `ssl.PROTOCOL_TLSv1_1`

  - `ssl.PROTOCOL_TLSv1_2`

  - `ssl.TLSVersion.SSLv3`

  - `ssl.TLSVersion.TLSv1`

  - `ssl.TLSVersion.TLSv1_1`

- `threading` methods:

  - `threading.Condition.notifyAll()`: use `notify_all()`.

  - `threading.Event.isSet()`: use `is_set()`.

  - `threading.Thread.isDaemon()`, `threading.Thread.setDaemon()`: use `threading.Thread.daemon` attribute.

  - `threading.Thread.getName()`, `threading.Thread.setName()`: use `threading.Thread.name` attribute.

  - `threading.currentThread()`: use `threading.current_thread()`.

  - `threading.activeCount()`: use `threading.active_count()`.

- `typing.Text` (gh-92332).

- `unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value that is not `None` from a test case.

- `urllib.parse` deprecated functions: `urlparse()` instead

  - `splitattr()`

  - `splithost()`

  - `splitnport()`

  - `splitpasswd()`

  - `splitport()`

  - `splitquery()`

  - `splittag()`

  - `splittype()`

  - `splituser()`

  - `splitvalue()`

  - `to_bytes()`

- `urllib.request`: `URLopener` and `FancyURLopener` style of invoking requests is deprecated. Use newer `urlopen()` functions and methods.

- `wsgiref`: `SimpleHandler.stdout.write()` should not do partial writes.

- `xml.etree.ElementTree`: Testing the truth value of an `Element` is deprecated. In a future release it will always return `True`. Prefer explicit `len(elem)` or `elem is not None` tests instead.

- `zipimport.zipimporter.load_module()` is deprecated: use `exec_module()` instead.

## Eliminado

### asynchat y asyncore

- Estos dos módulos se eliminaron según lo programado en PEP 594 y quedaron obsoletos en Python 3.6. Utilice `asyncio` en su lugar. (Aportado por Nikita Sobolev en gh-96580.)

### configparser

- Varios nombres obsoletos en `configparser` en 3.2 se han eliminado según gh-89336:

  - `configparser.ParsingError` ya no tiene un atributo o argumento `filename`. Utilice el atributo y el argumento `source` en su lugar.

  - `configparser` ya no tiene una clase `SafeConfigParser`. Utilice en su lugar el nombre `ConfigParser` más corto.

  - `configparser.ConfigParser` ya no tiene un método `readfp`. Utilice `read_file()` en su lugar.

### distutils

- Elimine el paquete `distutils`. Quedó obsoleto en Python 3.10 por PEP 632 «Módulo distutils obsoleto». Para proyectos que todavía usan `distutils` y no se pueden actualizar a otra cosa, se puede instalar el proyecto `setuptools`: todavía proporciona `distutils`. (Aportado por Victor Stinner en gh-92584.)

### ensurepip

- Retire la rueda de herramientas de configuración incluida en `ensurepip` y deje de instalar herramientas de configuración en entornos creados por `venv`.

  `pip (>= 22.1)` no requiere la instalación de herramientas de configuración en el entorno. Los paquetes basados ​​en `setuptools` (y `distutils`) aún se pueden usar con `pip install`, ya que pip proporcionará `setuptools` en el entorno de compilación que utiliza para crear un paquete.

  `easy_install`, `pkg_resources`, `setuptools` y `distutils` ya no se proporcionan de forma predeterminada en entornos creados con `venv` o arrancados con `ensurepip`, ya que forman parte del paquete `setuptools`. Para proyectos que dependen de estos en tiempo de ejecución, el proyecto `setuptools` debe declararse como una dependencia e instalarse por separado (generalmente, usando pip).

  (Aportado por Pradyun Gedam en gh-95299.)

### enum

- Elimine `EnumMeta.__getattr__` de `enum`, que ya no es necesario para acceder al atributo de enumeración. (Aportado por Ethan Furman en gh-95083.)

### ftplib

- Elimine el atributo de clase `FTP_TLS.ssl_version` de `ftplib`: utilice el parámetro context en su lugar. (Aportado por Victor Stinner en gh-94172.)

### gzip

- Elimine el atributo `filename` del `gzip.GzipFile` de `gzip`, en desuso desde Python 2.6; utilice el atributo `name` en su lugar. En modo de escritura, el atributo `filename` agregaba la extensión de archivo `'.gz'` si no estaba presente. (Aportado por Victor Stinner en gh-94196.)

### hashlib

- Remove the pure Python implementation of `hashlib`’s `hashlib.pbkdf2_hmac()`, deprecated in Python 3.10. Python 3.10 and newer requires OpenSSL 1.1.1 (PEP 644): this OpenSSL version provides a C implementation of `pbkdf2_hmac()` which is faster. (Contributed by Victor Stinner in gh-94199.)

### importlib

- Muchas limpiezas anteriormente obsoletas en `importlib` ahora se han completado:

  - References to, and support for `module_repr()` has been removed. (Contributed by Barry Warsaw in gh-97850.)

  - Se han eliminado `importlib.util.set_package`, `importlib.util.set_loader` y `importlib.util.module_for_loader`. (Contribución de Brett Cannon y Nikita Sobolev en gh-65961 y gh-97850.)

  - Se eliminó la compatibilidad con las API `find_loader()` y `find_module()`. (Aportado por Barry Varsovia en gh-98040.)

  - Se han eliminado `importlib.abc.Finder`, `pkgutil.ImpImporter` y `pkgutil.ImpLoader`. (Aportado por Barry Varsovia en gh-98040.)

### imp

- Se ha eliminado el módulo `imp`. (Aportado por Barry Varsovia en gh-98040.)

  Para migrar consulte la siguiente tabla de correspondencias:

  > imp | importlib
  > --- | ---
  > `imp.NullImporter` | Inserta `None` en `sys.path_importer_cache`
  > `imp.cache_from_source()` | `importlib.util.cache_from_source()`
  > `imp.find_module()` | `importlib.util.find_spec()`
  > `imp.get_magic()` | `importlib.util.MAGIC_NUMBER`
  > `imp.get_suffixes()` | `importlib.machinery.SOURCE_SUFFIXES`, `importlib.machinery.EXTENSION_SUFFIXES`, and `importlib.machinery.BYTECODE_SUFFIXES`
  > `imp.get_tag()` | `sys.implementation.cache_tag`
  > `imp.load_module()` | `importlib.import_module()`
  > `imp.new_module(name)` | `types.ModuleType(name)`
  > `imp.reload()` | `importlib.reload()`
  > `imp.source_from_cache()` | `importlib.util.source_from_cache()`
  > `imp.load_source()` | Ver abajo

  Reemplace `imp.load_source()` con:

      import importlib.util
      import importlib.machinery

      def load_source(modname, filename):
          loader = importlib.machinery.SourceFileLoader(modname, filename)
          spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
          module = importlib.util.module_from_spec(spec)
          # The module is always executed and not cached in sys.modules.
          # Uncomment the following line to cache the module.
          # sys.modules[module.__name__] = module
          loader.exec_module(module)
          return module

- Elimine las funciones y atributos de `imp` sin reemplazos:

  - Funciones no documentadas:

    - `imp.init_builtin()`

    - `imp.load_compiled()`

    - `imp.load_dynamic()`

    - `imp.load_package()`

  - `imp.lock_held()`, `imp.acquire_lock()`, `imp.release_lock()`: el esquema de bloqueo ha cambiado en Python 3.3 a bloqueos por módulo.

  - Constantes `imp.find_module()`: `SEARCH_ERROR`, `PY_SOURCE`, `PY_COMPILED`, `C_EXTENSION`, `PY_RESOURCE`, `PKG_DIRECTORY`, `C_BUILTIN`, `PY_FROZEN`, `PY_CODERESOURCE`, `IMP_HOOK`.

### io

- Elimine `io.OpenWrapper` y `_pyio.OpenWrapper` de `io`, obsoletos en Python 3.10: simplemente use `open()` en su lugar. La función `open()` (`io.open()`) es una función incorporada. Desde Python 3.10, `_pyio.open()` también es un método estático. (Aportado por Victor Stinner en gh-94169.)

### locale

- Elimine la función `locale.format()` de `locale`, obsoleta en Python 3.7: use `locale.format_string()` en su lugar. (Aportado por Victor Stinner en gh-94226.)

### smtpd

- The `smtpd` module has been removed according to the schedule in PEP 594, having been deprecated in Python 3.4.7 and 3.5.4. Use the aiosmtpd PyPI module or any other `asyncio`-based server instead. (Contributed by Oleg Iarygin in gh-93243.)

### sqlite3

- Las siguientes características `sqlite3` no documentadas, obsoletas en Python 3.10, ahora se eliminan:

  - `sqlite3.enable_shared_cache()`

  - `sqlite3.OptimizedUnicode`

  Si se debe utilizar una caché compartida, abra la base de datos en modo URI utilizando el parámetro de consulta `cache=shared`.

  La fábrica de textos `sqlite3.OptimizedUnicode` ha sido un alias para `str` desde Python 3.3. El código que previamente configuró la fábrica de texto en `OptimizedUnicode` puede usar `str` explícitamente o confiar en el valor predeterminado que también es `str`.

  (Aportado por Erlend E. Aasland en gh-92548.)

### ssl

- Elimine la función `ssl.RAND_pseudo_bytes()` de `ssl`, obsoleta en Python 3.6: use `os.urandom()` o `ssl.RAND_bytes()` en su lugar. (Aportado por Victor Stinner en gh-94199.)

- Elimine la función `ssl.match_hostname()`. Quedó obsoleto en Python 3.7. OpenSSL realiza coincidencias de nombres de host desde Python 3.7, Python ya no usa la función `ssl.match_hostname()`. (Aportado por Victor Stinner en gh-94199.)

- Remove the `ssl.wrap_socket()` function, deprecated in Python 3.7: instead, create a `ssl.SSLContext` object and call its `ssl.SSLContext.wrap_socket` method. Any package that still uses `ssl.wrap_socket()` is broken and insecure. The function neither sends a SNI TLS extension nor validates the server hostname. Code is subject to CWE 295 (Improper Certificate Validation). (Contributed by Victor Stinner in gh-94199.)

### unittest

- Elimine muchas características de `unittest` que están en desuso desde hace mucho tiempo:

  - Varios alias del método `TestCase`:

    Alias obsoleto | Nombre del método | En desuso en
    --- | --- | ---
    `failUnless` | `assertTrue()` | 3.1
    `failIf` | `assertFalse()` | 3.1
    `failUnlessEqual` | `assertEqual()` | 3.1
    `failIfEqual` | `assertNotEqual()` | 3.1
    `failUnlessAlmostEqual` | `assertAlmostEqual()` | 3.1
    `failIfAlmostEqual` | `assertNotAlmostEqual()` | 3.1
    `failUnlessRaises` | `assertRaises()` | 3.1
    `assert_` | `assertTrue()` | 3.2
    `assertEquals` | `assertEqual()` | 3.2
    `assertNotEquals` | `assertNotEqual()` | 3.2
    `assertAlmostEquals` | `assertAlmostEqual()` | 3.2
    `assertNotAlmostEquals` | `assertNotAlmostEqual()` | 3.2
    `assertRegexpMatches` | `assertRegex()` | 3.2
    `assertRaisesRegexp` | `assertRaisesRegex()` | 3.2
    `assertNotRegexpMatches` | `assertNotRegex()` | 3.5

    Puede utilizar https://github.com/isidentical/teyit para modernizar automáticamente sus pruebas unitarias.

  - Método `assertDictContainsSubset` de `TestCase` indocumentado y roto (obsoleto en Python 3.2).

  - Undocumented `TestLoader.loadTestsFromModule` parameter use_load_tests (deprecated and ignored since Python 3.5).

  - Un alias de la clase `TextTestResult`: `_TextTestResult` (obsoleto en Python 3.2).

  (Contribución de Serhiy Storchaka en gh-89325.)

### webbrowser

- Elimina la compatibilidad con navegadores obsoletos de `webbrowser`. Los navegadores eliminados incluyen: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird y Firefox versiones 35 e inferiores (gh-102871).

### xml.etree.ElementTree

- Elimine el método `ElementTree.Element.copy()` de la implementación pura de Python, obsoleto en Python 3.10, use la función `copy.copy()` en su lugar. La implementación C de `xml.etree.ElementTree` no tiene ningún método `copy()`, solo un método `__copy__()`. (Aportado por Victor Stinner en gh-94383.)

### zipimport

- Elimine los métodos `find_loader()` y `find_module()` de `zipimport`, obsoletos en Python 3.10: use el método `find_spec()` en su lugar. Consulte PEP 451 para conocer el fundamento. (Aportado por Victor Stinner en gh-94379.)

### Otros

- Elimine la regla `suspicious` de la documentación `Makefile` y `Doc/tools/rstlint.py`, ambas a favor de sphinx-lint. (Contribución de Julien Palard en gh-98179.)

- Elimine los parámetros keyfile y certfile de los módulos `ftplib`, `imaplib`, `poplib` y `smtplib`, y los parámetros key_file, cert_file y check_hostname del módulo `http.client`, todos obsoletos desde Python 3.6. Utilice el parámetro context (ssl_context en `imaplib`) en su lugar. (Aportado por Victor Stinner en gh-94172.)

- Elimine los trucos de compatibilidad `Jython` de varios módulos y pruebas stdlib. (Aportado por Nikita Sobolev en gh-99482.)

- Elimine el indicador `_use_broken_old_ctypes_structure_semantics_` del módulo `ctypes`. (Aportado por Nikita Sobolev en gh-99285.)

## Portar a Python 3.12

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

- Ahora se aplican reglas más estrictas para las referencias numéricas de grupos y los nombres de grupos en expresiones regulares. Ahora sólo se acepta como referencia numérica la secuencia de dígitos ASCII. El nombre del grupo en patrones de bytes y cadenas de reemplazo ahora solo puede contener letras y dígitos ASCII y guiones bajos. (Contribución de Serhiy Storchaka en gh-91760.)

- Elimine la funcionalidad `randrange()` en desuso desde Python 3.10. Anteriormente, `randrange(10.0)` se convertía sin pérdidas a `randrange(10)`. Ahora, genera un `TypeError`. Además, la excepción planteada para valores no enteros como `randrange(10.5)` o `randrange('10')` se cambió de `ValueError` a `TypeError`. Esto también evita errores en los que `randrange(1e25)` seleccionaría silenciosamente de un rango mayor que `randrange(10**25)`. (Originalmente sugerido por Serhiy Storchaka gh-86388.)

- `argparse.ArgumentParser` cambió la codificación y el controlador de errores para leer argumentos de un archivo (por ejemplo, la opción `fromfile_prefix_chars`) de la codificación de texto predeterminada (por ejemplo, `locale.getpreferredencoding(False)`) a filesystem encoding and error handler. Los archivos de argumentos deben codificarse en UTF-8 en lugar de en la página de códigos ANSI en Windows.

- Remove the `asyncore`-based `smtpd` module deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is the `asyncio`-based aiosmtpd PyPI module.

- `shlex.split()`: Pasar `None` por el argumento s ahora genera una excepción, en lugar de leer `sys.stdin`. La característica quedó obsoleta en Python 3.9. (Aportado por Victor Stinner en gh-94352.)

- El módulo `os` ya no acepta rutas tipo bytes, como los tipos `bytearray` y `memoryview`: solo se acepta el tipo exacto `bytes` para cadenas de bytes. (Aportado por Victor Stinner en gh-98393.)

- `syslog.openlog()` y `syslog.closelog()` ahora fallan si se usan en subintérpretes. `syslog.syslog()` aún se puede usar en subintérpretes, pero ahora solo si `syslog.openlog()` ya ha sido llamado en el intérprete principal. Estas nuevas restricciones no se aplican al intérprete principal, por lo que sólo un conjunto muy pequeño de usuarios podría verse afectado. Este cambio ayuda con el aislamiento del intérprete. Además, `syslog` es un contenedor de recursos globales de procesos, que se administran mejor desde el intérprete principal. (Aportado por Donghee Na en gh-99127.)

- Se elimina el comportamiento de bloqueo no documentado de `cached_property()`, porque bloqueaba todas las instancias de la clase, lo que generaba una alta contención de bloqueo. Esto significa que una función de obtención de propiedades almacenadas en caché ahora podría ejecutarse más de una vez para una sola instancia, si dos subprocesos se ejecutan. Para la mayoría de las propiedades almacenadas en caché simples (por ejemplo, aquellas que son idempotentes y simplemente calculan un valor en función de otros atributos de la instancia), esto estará bien. Si se necesita sincronización, implemente el bloqueo dentro de la función de obtención de propiedades en caché o alrededor de puntos de acceso de subprocesos múltiples.

- `sys._current_exceptions()` ahora devuelve una asignación de thread-id a una instancia de excepción, en lugar de a una tupla `(typ, exc, tb)`. (Aportado por Irit Katriel en gh-103176.)

- Al extraer archivos tar usando `tarfile` o `shutil.unpack_archive()`, pase el argumento filter para limitar las funciones que pueden resultar sorprendentes o peligrosas. Consulte Extraction filters para obtener más detalles.

- La salida de las funciones `tokenize.tokenize()` y `tokenize.generate_tokens()` ahora cambia debido a los cambios introducidos en PEP 701. Esto significa que los tokens `STRING` ya no se emiten para cadenas f y los tokens descritos en PEP 701 ahora se producen en su lugar: `FSTRING_START`, `FSTRING_MIDDLE` y `FSTRING_END` ahora se emiten para partes de «cadena» de cadena f además de los tokens apropiados para la tokenización. en los componentes de la expresión. Por ejemplo, para la cadena f `f"start {1+1} end"`, la versión anterior del tokenizador emitió:

      1,0-1,18:           STRING         'f"start {1+1} end"'

  mientras que la nueva versión emite:

      1,0-1,2:            FSTRING_START  'f"'
      1,2-1,8:            FSTRING_MIDDLE 'start '
      1,8-1,9:            OP             '{'
      1,9-1,10:           NUMBER         '1'
      1,10-1,11:          OP             '+'
      1,11-1,12:          NUMBER         '1'
      1,12-1,13:          OP             '}'
      1,13-1,17:          FSTRING_MIDDLE ' end'
      1,17-1,18:          FSTRING_END    '"'

  Además, puede haber algunos cambios de comportamiento menores como consecuencia de los cambios necesarios para admitir PEP 701. Algunos de estos cambios incluyen:

  - El atributo `type` de los tokens emitidos al tokenizar algunos caracteres de Python no válidos, como `!`, ha cambiado de `ERRORTOKEN` a `OP`.

  - Las cadenas incompletas de una sola línea ahora también generan `tokenize.TokenError` como lo hacen las cadenas incompletas de varias líneas.

  - Algún código Python incompleto o no válido ahora genera `tokenize.TokenError` en lugar de devolver tokens `ERRORTOKEN` arbitrarios al tokenizarlo.

  - Ya no se admite la combinación de tabulaciones y espacios como sangría en el mismo archivo y generará un `TabError`.

- The `threading` module now expects the `_thread` module to have an `_is_main_interpreter` attribute. It is a function with no arguments that returns `True` if the current interpreter is the main interpreter.

  Any library or application that provides a custom `_thread` module should provide `_is_main_interpreter()`. (See gh-112826.)

## Cambios de compilación

- Python ya no usa `setup.py` para crear módulos de extensión C compartidos. Los parámetros de compilación, como encabezados y bibliotecas, se detectan en el script `configure`. Las extensiones están construidas por `Makefile`. La mayoría de las extensiones usan `pkg-config` y recurren a la detección manual. (Aportado por Christian Heimes en gh-93939.)

- Ahora se requiere `va_start()` con dos parámetros, como `va_start(args, format),`, para compilar Python. `va_start()` ya no se llama con un solo parámetro. (Aportado por Kumar Aditya en gh-93207.)

- CPython ahora usa la opción ThinLTO como política predeterminada de optimización del tiempo de enlace si el compilador Clang acepta la marca. (Aportado por Donghee Na en gh-89536.)

- Agregado la variable `COMPILEALL_OPTS` en `Makefile` para anular las opciones de `compileall` (predeterminada: `-j0`) en `make install`. También fusionó los 3 comandos `compileall` en un solo comando para crear archivos .pyc para todos los niveles de optimización (0, 1, 2) a la vez. (Aportado por Victor Stinner en gh-99289.)

- Agregado tripletes de plataforma para LoongArch de 64 bits:

  - loongarch64-linux-gnusf

  - loongarch64-linux-gnuf32

  - loongarch64-linux-gnu

  (Aportado por Zhang Na en gh-90656.)

- `PYTHON_FOR_REGEN` ahora requiere Python 3.10 o posterior.

- Ahora se requieren Autoconf 2.71 y aclocal 1.16.4 para regenerar `!configure`. (Aportado por Christian Heimes en gh-89886.)

- Las compilaciones de Windows y los instaladores de macOS de python.org ahora usan OpenSSL 3.0.

## Cambios en la API de C

### Nuevas características

- PEP 697: presente Unstable C API tier, destinado a herramientas de bajo nivel como depuradores y compiladores JIT. Esta API puede cambiar en cada versión menor de CPython sin advertencias de obsolescencia. Su contenido está marcado con el prefijo `PyUnstable_` en los nombres.

  Constructores de objetos de código:

  - `PyUnstable_Code_New()` (renombrado de `PyCode_New`)

  - `PyUnstable_Code_NewWithPosOnlyArgs()` (renombrado de `PyCode_NewWithPosOnlyArgs`)

  Almacenamiento adicional para objetos de código (PEP 523):

  - `PyUnstable_Eval_RequestCodeExtraIndex()` (renombrado de `_PyEval_RequestCodeExtraIndex`)

  - `PyUnstable_Code_GetExtra()` (renombrado de `_PyCode_GetExtra`)

  - `PyUnstable_Code_SetExtra()` (renombrado de `_PyCode_SetExtra`)

  Los nombres originales seguirán estando disponibles hasta que cambie la API respectiva.

  (Aportado por Petr Viktorin en gh-101101.)

- PEP 697: agregue una API para extender tipos cuyo diseño de memoria de instancia es opaco:

  - `PyType_Spec.basicsize` puede ser cero o negativo para especificar heredar o ampliar el tamaño de la clase base.

  - Se agregaron `PyObject_GetTypeData()` y `PyType_GetTypeDataSize()` para permitir el acceso a datos de instancia específicos de subclase.

  - Se agregaron `Py_TPFLAGS_ITEMS_AT_END` y `PyObject_GetItemData()` para permitir extender de forma segura ciertos tipos de tamaño variable, incluido `PyType_Type`.

  - Se agregó `Py_RELATIVE_OFFSET` para permitir definir `members` en términos de una estructura específica de subclase.

  (Aportado por Petr Viktorin en gh-103509.)

- Agregado la nueva función limited C API `PyType_FromMetaclass()`, que generaliza el `PyType_FromModuleAndSpec()` existente utilizando un argumento de metaclase adicional. (Aportado por Wenzel Jakob en gh-93012.)

- Se agregó API para crear objetos que se pueden llamar usando the vectorcall protocol a Limited API:

  - `Py_TPFLAGS_HAVE_VECTORCALL`

  - `PyVectorcall_NARGS()`

  - `PyVectorcall_Call()`

  - `vectorcallfunc`

  El indicador `Py_TPFLAGS_HAVE_VECTORCALL` ahora se elimina de una clase cuando se reasigna el método `__call__()` de la clase. Esto hace que vectorcall sea seguro de usar con tipos mutables (es decir, tipos de montón sin el indicador inmutable, `Py_TPFLAGS_IMMUTABLETYPE`). Los tipos mutables que no anulan `tp_call` ahora heredan el indicador `Py_TPFLAGS_HAVE_VECTORCALL`. (Aportado por Petr Viktorin en gh-93274.)

  The `Py_TPFLAGS_MANAGED_DICT` and `Py_TPFLAGS_MANAGED_WEAKREF` flags have been added. This allows extensions classes to support object `__dict__` and weakrefs with less bookkeeping, using less memory and with faster access.

- Se agregó API para realizar llamadas usando the vectorcall protocol a Limited API:

  - `PyObject_Vectorcall()`

  - `PyObject_VectorcallMethod()`

  - `PY_VECTORCALL_ARGUMENTS_OFFSET`

  Esto significa que tanto el extremo entrante como el saliente del protocolo de llamada vectorial ahora están disponibles en el Limited API. (Aportado por Wenzel Jakob en gh-98586.)

- Agregado dos nuevas funciones públicas, `PyEval_SetProfileAllThreads()` y `PyEval_SetTraceAllThreads()`, que permiten configurar funciones de seguimiento y creación de perfiles en todos los subprocesos en ejecución además del que realiza la llamada. (Aportado por Pablo Galindo en gh-93503.)

- Agregado la nueva función `PyFunction_SetVectorcall()` a la API de C que establece el campo de llamada vectorial de un `PyFunctionObject` determinado. (Aportado por Andrew Frost en gh-92257.)

- La API de C ahora permite registrar devoluciones de llamada a través de `PyDict_AddWatcher()`, `PyDict_Watch()` y API relacionadas para ser llamadas cada vez que se modifica un diccionario. Está pensado para optimizar intérpretes, compiladores JIT o depuradores. (Aportado por Carl Meyer en gh-91052.)

- Agregado las API `PyType_AddWatcher()` y `PyType_Watch()` para registrar devoluciones de llamadas y recibir notificaciones sobre cambios en un tipo. (Aportado por Carl Meyer en gh-91051.)

- Agregado las API `PyCode_AddWatcher()` y `PyCode_ClearWatcher()` para registrar devoluciones de llamadas y recibir notificaciones sobre la creación y destrucción de objetos de código. (Aportado por Itamar Oren en gh-91054.)

- Agregado las funciones `PyFrame_GetVar()` y `PyFrame_GetVarString()` para obtener una variable de marco por su nombre. (Aportado por Victor Stinner en gh-91248.)

- Agregado `PyErr_GetRaisedException()` y `PyErr_SetRaisedException()` para guardar y restaurar la excepción actual. Estas funciones devuelven y aceptan un único objeto de excepción, en lugar de los argumentos triples de los ahora obsoletos `PyErr_Fetch()` y `PyErr_Restore()`. Esto es menos propenso a errores y un poco más eficiente. (Aportado por Mark Shannon en gh-101578.)

- Agregado `_PyErr_ChainExceptions1`, que toma una instancia de excepción, para reemplazar la API heredada `_PyErr_ChainExceptions`, que ahora está en desuso. (Aportado por Mark Shannon en gh-101578.)

- Agregado `PyException_GetArgs()` y `PyException_SetArgs()` como funciones convenientes para recuperar y modificar el `args` pasado al constructor de la excepción. (Aportado por Mark Shannon en gh-101578.)

- Agregado `PyErr_DisplayException()`, que toma una instancia de excepción, para reemplazar la API heredada `PyErr_Display()`. (Aportado por Irit Katriel en gh-102755).

- PEP 683: presente Immortal Objects, que permite que los objetos omitan los recuentos de referencias y los cambios relacionados en C-API:

  - `_Py_IMMORTAL_REFCNT`: el recuento de referencias que define un objeto

      como inmortal.

  - `_Py_IsImmortal` Comprueba si un objeto tiene el recuento de referencia inmortal.

  - `PyObject_HEAD_INIT` Esto ahora inicializará el recuento de referencias

      `_Py_IMMORTAL_REFCNT` cuando se utiliza con `Py_BUILD_CORE`.

  - `SSTATE_INTERNED_IMMORTAL` Un identificador para objetos Unicode internos

      que son inmortales.

  - `SSTATE_INTERNED_IMMORTAL_STATIC` Un identificador para Unicode interno

      Objetos inmortales y estáticos.

  - `sys.getunicodeinternedsize` Esto devuelve el número total de Unicode

      objetos que han sido internados. Esto ahora es necesario para que `refleak.py` rastree correctamente los recuentos de referencia y los bloques asignados.

  (Contribuido por Eddie Elizondo en gh-84436.)

- PEP 684: agregue la nueva función `Py_NewInterpreterFromConfig()` y `PyInterpreterConfig`, que pueden usarse para crear subintérpretes con sus propios GIL. (Consulte PEP 684: un GIL por intérprete para obtener más información). (Contribución de Eric Snow en gh-104110.)

- En la versión limitada de C API 3.12, las funciones `Py_INCREF()` y `Py_DECREF()` ahora se implementan como llamadas de función opacas para ocultar los detalles de implementación. (Aportado por Victor Stinner en gh-105387.)

### Portar a Python 3.12

- Se han eliminado las API Unicode heredadas basadas en la representación `Py_UNICODE*`. Migre a API basadas en UTF-8 o `wchar_t*`.

- Las funciones de análisis de argumentos como `PyArg_ParseTuple()` ya no admiten el formato basado en `Py_UNICODE*` (por ejemplo, `u`, `Z`). Migre a otros formatos para Unicode como `s`, `z`, `es` y `U`.

- `tp_weaklist` para todos los tipos integrados estáticos siempre es `NULL`. Este es un campo solo interno en `PyTypeObject`, pero señalamos el cambio en caso de que alguien acceda al campo directamente de todos modos. Para evitar roturas, considere utilizar la C-API pública existente o, si es necesario, la macro `_PyObject_GET_WEAKREFS_LISTPTR()` (solo interna).

- Es posible que este `PyTypeObject.tp_subclasses` solo interno ya no sea un puntero de objeto válido. Su tipo se cambió a void* para reflejar esto. Mencionamos esto en caso de que alguien acceda directamente al campo interno.

  To get a list of subclasses, call the Python method `__subclasses__()` (using `PyObject_CallMethod()`, for example).

- Agregado soporte para más opciones de formato (alineación a la izquierda, octales, hexadecimales en mayúsculas, cadenas `intmax_t`, `ptrdiff_t`, `wchar_t` C, ancho variable y precisión) en `PyUnicode_FromFormat()` y `PyUnicode_FromFormatV()`. (Aportado por Serhiy Storchaka en gh-98836.)

- Un carácter de formato no reconocido en `PyUnicode_FromFormat()` y `PyUnicode_FromFormatV()` ahora establece un `SystemError`. En versiones anteriores, provocaba que el resto de la cadena de formato se copiara tal cual en la cadena de resultado y se descartaran los argumentos adicionales. (Aportado por Serhiy Storchaka en gh-95781.)

- Se corrigió la ubicación incorrecta de los letreros en `PyUnicode_FromFormat()` y `PyUnicode_FromFormatV()`. (Aportado por Philip Georgi en gh-95504.)

- Extension classes wanting to add a `__dict__` or weak reference slot should use `Py_TPFLAGS_MANAGED_DICT` and `Py_TPFLAGS_MANAGED_WEAKREF` instead of `tp_dictoffset` and `tp_weaklistoffset`, respectively. The use of `tp_dictoffset` and `tp_weaklistoffset` is still supported, but does not fully support multiple inheritance (gh-95589), and performance may be worse. Classes declaring `Py_TPFLAGS_MANAGED_DICT` should call `_PyObject_VisitManagedDict()` and `_PyObject_ClearManagedDict()` to traverse and clear their instance’s dictionaries. To clear weakrefs, call `PyObject_ClearWeakRefs()`, as before.

- La función `PyUnicode_FSDecoder()` ya no acepta rutas de tipo bytes, como los tipos `bytearray` y `memoryview`: solo se acepta el tipo `bytes` exacto para cadenas de bytes. (Aportado por Victor Stinner en gh-98393.)

- Las macros `Py_CLEAR`, `Py_SETREF` y `Py_XSETREF` ahora solo evalúan sus argumentos una vez. Si un argumento tiene efectos secundarios, estos efectos secundarios ya no se duplican. (Aportado por Victor Stinner en gh-98724.)

- El indicador de error del intérprete ahora siempre está normalizado. Esto significa que `PyErr_SetObject()`, `PyErr_SetString()` y las otras funciones que configuran el indicador de error ahora normalizan la excepción antes de almacenarla. (Aportado por Mark Shannon en gh-101578.)

- `_Py_RefTotal` ya no tiene autoridad y solo se conserva por compatibilidad con ABI. Tenga en cuenta que es un global interno y solo está disponible en compilaciones de depuración. Si lo está utilizando, deberá comenzar a utilizar `_Py_GetGlobalRefTotal()`.

- Las siguientes funciones ahora seleccionan una metaclase apropiada para el tipo recién creado:

  - `PyType_FromSpec()`

  - `PyType_FromSpecWithBases()`

  - `PyType_FromModuleAndSpec()`

  La creación de clases cuya metaclase anule `tp_new` está en desuso y en Python 3.14+ no estará permitida. Tenga en cuenta que estas funciones ignoran `tp_new` de la metaclase, lo que posiblemente permita una inicialización incompleta.

  Tenga en cuenta que `PyType_FromMetaclass()` (agregado en Python 3.12) ya no permite la creación de clases cuya metaclase anule `tp_new` (`__new__()` en Python).

  Dado que `tp_new` anula casi todo lo que hacen las funciones `PyType_From*`, las dos son incompatibles entre sí. El comportamiento existente (ignorar la metaclase durante varios pasos de la creación de tipos) no es seguro en general, ya que las (meta)clases suponen que se llamó a `tp_new`. No existe una solución general sencilla. Uno de los siguientes puede funcionar para usted:

  - Si controlas la metaclase, evita usar `tp_new` en ella:

    - Si se puede omitir la inicialización, se puede realizar en `tp_init`.

    - Si no es necesario crear una instancia de la metaclase desde Python, configure su `tp_new` en `NULL` usando el indicador `Py_TPFLAGS_DISALLOW_INSTANTIATION`. Esto lo hace aceptable para funciones `PyType_From*`.

  - Evite las funciones `PyType_From*`: si no necesita funciones específicas de C (ranuras o configuración del tamaño de la instancia), cree tipos mediante la metaclase calling.

  - Si know puede omitir `tp_new` de forma segura, filtre la advertencia de obsolescencia usando `warnings.catch_warnings()` de Python.

- `PyOS_InputHook` y `PyOS_ReadlineFunctionPointer` ya no se llaman en subinterpreters. Esto se debe a que los clientes generalmente dependen del estado global de todo el proceso (ya que estas devoluciones de llamada no tienen forma de recuperar el estado del módulo de extensión).

  Esto también evita situaciones en las que las extensiones pueden encontrarse ejecutándose en un subintérprete que no admiten (o que aún no se han cargado). Consulte gh-104668 para obtener más información.

- `PyLongObject` ha tenido cambios internos para un mejor rendimiento. Aunque las partes internas de `PyLongObject` son privadas, algunos módulos de extensión las utilizan. Ya no se debe acceder directamente a los campos internos, sino que se deben utilizar las funciones API que comienzan con `PyLong_...`. Se proporcionan dos nuevas funciones API unstable para un acceso eficiente al valor de `PyLongObject`s que cabe en una sola palabra de máquina:

  - `PyUnstable_Long_IsCompact()`

  - `PyUnstable_Long_CompactValue()`

- Ahora se requiere que los asignadores personalizados, configurados a través de `PyMem_SetAllocator()`, sean seguros para subprocesos, independientemente del dominio de memoria. Los asignadores que no tienen su propio estado, incluidos los «ganchos», no se ven afectados. Si su asignador personalizado aún no es seguro para subprocesos y necesita orientación, cree una nueva incidencia en GitHub y CC `@ericsnowcurrently`.

### Obsoleto

- De acuerdo con PEP 699, el campo `ma_version_tag` en `PyDictObject` está obsoleto para los módulos de extensión. Acceder a este campo generará una advertencia del compilador en el momento de la compilación. Este campo se eliminará en Python 3.14. (Contribución de Ramvikrams y Kumar Aditya en gh-101193. PEP de Ken Jin.)

- Variable de configuración global obsoleta:

  - `Py_DebugFlag`: use `PyConfig.parser_debug`

  - `Py_VerboseFlag`: use `PyConfig.verbose`

  - `Py_QuietFlag`: use `PyConfig.quiet`

  - `Py_InteractiveFlag`: use `PyConfig.interactive`

  - `Py_InspectFlag`: use `PyConfig.inspect`

  - `Py_OptimizeFlag`: use `PyConfig.optimization_level`

  - `Py_NoSiteFlag`: use `PyConfig.site_import`

  - `Py_BytesWarningFlag`: use `PyConfig.bytes_warning`

  - `Py_FrozenFlag`: use `PyConfig.pathconfig_warnings`

  - `Py_IgnoreEnvironmentFlag`: use `PyConfig.use_environment`

  - `Py_DontWriteBytecodeFlag`: use `PyConfig.write_bytecode`

  - `Py_NoUserSiteDirectory`: use `PyConfig.user_site_directory`

  - `Py_UnbufferedStdioFlag`: use `PyConfig.buffered_stdio`

  - `Py_HashRandomizationFlag`: use `PyConfig.use_hash_seed` y `PyConfig.hash_seed`

  - `Py_IsolatedFlag`: use `PyConfig.isolated`

  - `Py_LegacyWindowsFSEncodingFlag`: use `PyPreConfig.legacy_windows_fs_encoding`

  - `Py_LegacyWindowsStdioFlag`: use `PyConfig.legacy_windows_stdio`

  - `Py_FileSystemDefaultEncoding`: use `PyConfig.filesystem_encoding`

  - `Py_HasFileSystemDefaultEncoding`: use `PyConfig.filesystem_encoding`

  - `Py_FileSystemDefaultEncodeErrors`: use `PyConfig.filesystem_errors`

  - `Py_UTF8Mode`: use `PyPreConfig.utf8_mode` (ver `Py_PreInitialize()`)

  La API `Py_InitializeFromConfig()` debe usarse con `PyConfig` en su lugar. (Aportado por Victor Stinner en gh-77782.)

- La creación de `immutable types` con bases mutables está obsoleta y se deshabilitará en Python 3.14. (gh-95388)

- El encabezado `structmember.h` está en desuso, aunque sigue estando disponible y no hay planes para eliminarlo.

  Su contenido ahora está disponible simplemente incluyendo `Python.h`, con un prefijo `Py` agregado si faltara:

  - `PyMemberDef`, `PyMember_GetOne()` y `PyMember_SetOne()`

  - Escriba macros como `Py_T_INT`, `Py_T_DOUBLE`, etc. (anteriormente `T_INT`, `T_DOUBLE`, etc.)

  - Las banderas `Py_READONLY` (anteriormente `READONLY`) y `Py_AUDIT_READ` (anteriormente todas en mayúsculas)

  Varios elementos no están expuestos desde `Python.h`:

  - `T_OBJECT` (use `Py_T_OBJECT_EX`)

  - `T_NONE` (anteriormente indocumentado y bastante peculiar)

  - La macro `WRITE_RESTRICTED` que no hace nada.

  - Las macros `RESTRICTED` y `READ_RESTRICTED`, equivalentes a `Py_AUDIT_READ`.

  - En algunas configuraciones, `<stddef.h>` no se incluye en `Python.h`. Debe incluirse manualmente cuando se utiliza `offsetof()`.

  El encabezado obsoleto continúa proporcionando su contenido original con los nombres originales. Su código antiguo puede permanecer sin cambios, a menos que las macros de inclusión y sin espacio de nombres adicionales le molesten mucho.

  (Contribuido en gh-47146 por Petr Viktorin, basado en trabajos anteriores de Alexander Belopolsky y Matthias Braun.)

- `PyErr_Fetch()` y `PyErr_Restore()` están en desuso. Utilice `PyErr_GetRaisedException()` y `PyErr_SetRaisedException()` en su lugar. (Aportado por Mark Shannon en gh-101578.)

- `PyErr_Display()` está en desuso. Utilice `PyErr_DisplayException()` en su lugar. (Aportado por Irit Katriel en gh-102755).

- `_PyErr_ChainExceptions` está en desuso. Utilice `_PyErr_ChainExceptions1` en su lugar. (Aportado por Irit Katriel en gh-102192.)

- El uso de `PyType_FromSpec()`, `PyType_FromSpecWithBases()` o `PyType_FromModuleAndSpec()` para crear una clase cuya metaclase anula `tp_new` está en desuso. En su lugar, llame a la metaclase.

#### Eliminación pendiente en Python 3.14

- El campo `ma_version_tag` en `PyDictObject` para módulos de extensión (PEP 699; gh-101193).

- Creando `immutable types` con bases mutables (gh-95388).

- Functions to configure Python’s initialization, deprecated in Python 3.11:

  - `PySys_SetArgvEx()`: Set `PyConfig.argv` instead.

  - `PySys_SetArgv()`: Set `PyConfig.argv` instead.

  - `Py_SetProgramName()`: Set `PyConfig.program_name` instead.

  - `Py_SetPythonHome()`: Set `PyConfig.home` instead.

  La API `Py_InitializeFromConfig()` debe usarse con `PyConfig` en su lugar.

- Variables de configuración globales:

  - `Py_DebugFlag`: Use `PyConfig.parser_debug` instead.

  - `Py_VerboseFlag`: Use `PyConfig.verbose` instead.

  - `Py_QuietFlag`: Use `PyConfig.quiet` instead.

  - `Py_InteractiveFlag`: Use `PyConfig.interactive` instead.

  - `Py_InspectFlag`: Use `PyConfig.inspect` instead.

  - `Py_OptimizeFlag`: Use `PyConfig.optimization_level` instead.

  - `Py_NoSiteFlag`: Use `PyConfig.site_import` instead.

  - `Py_BytesWarningFlag`: Use `PyConfig.bytes_warning` instead.

  - `Py_FrozenFlag`: Use `PyConfig.pathconfig_warnings` instead.

  - `Py_IgnoreEnvironmentFlag`: Use `PyConfig.use_environment` instead.

  - `Py_DontWriteBytecodeFlag`: Use `PyConfig.write_bytecode` instead.

  - `Py_NoUserSiteDirectory`: Use `PyConfig.user_site_directory` instead.

  - `Py_UnbufferedStdioFlag`: Use `PyConfig.buffered_stdio` instead.

  - `Py_HashRandomizationFlag`: Use `PyConfig.use_hash_seed` and `PyConfig.hash_seed` instead.

  - `Py_IsolatedFlag`: Use `PyConfig.isolated` instead.

  - `Py_LegacyWindowsFSEncodingFlag`: Use `PyPreConfig.legacy_windows_fs_encoding` instead.

  - `Py_LegacyWindowsStdioFlag`: Use `PyConfig.legacy_windows_stdio` instead.

  - `Py_FileSystemDefaultEncoding`: Use `PyConfig.filesystem_encoding` instead.

  - `Py_HasFileSystemDefaultEncoding`: Use `PyConfig.filesystem_encoding` instead.

  - `Py_FileSystemDefaultEncodeErrors`: Use `PyConfig.filesystem_errors` instead.

  - `Py_UTF8Mode`: Use `PyPreConfig.utf8_mode` instead. (see `Py_PreInitialize()`)

  La API `Py_InitializeFromConfig()` debe usarse con `PyConfig` en su lugar.

#### Eliminación pendiente en Python 3.15

- The bundled copy of `libmpdecimal`.

- The `PyImport_ImportModuleNoBlock()`: Use `PyImport_ImportModule()` instead.

- `PyWeakref_GetObject()` and `PyWeakref_GET_OBJECT()`: Use `PyWeakref_GetRef()` instead.

- `Py_UNICODE` type and the `Py_UNICODE_WIDE` macro: Use `wchar_t` instead.

- Funciones de inicialización de Python:

  - `PySys_ResetWarnOptions()`: Clear `sys.warnoptions` and `warnings.filters` instead.

  - `Py_GetExecPrefix()`: Get `sys.exec_prefix` instead.

  - `Py_GetPath()`: Get `sys.path` instead.

  - `Py_GetPrefix()`: Get `sys.prefix` instead.

  - `Py_GetProgramFullPath()`: Get `sys.executable` instead.

  - `Py_GetProgramName()`: Get `sys.executable` instead.

  - `Py_GetPythonHome()`: Get `PyConfig.home` or the `PYTHONHOME` environment variable instead.

#### Eliminación pendiente en versiones futuras

Las siguientes API están obsoletas y se eliminarán, aunque actualmente no hay una fecha programada para su eliminación.

- `Py_TPFLAGS_HAVE_FINALIZE`: Unneeded since Python 3.8.

- `PyErr_Fetch()`: Use `PyErr_GetRaisedException()` instead.

- `PyErr_NormalizeException()`: Use `PyErr_GetRaisedException()` instead.

- `PyErr_Restore()`: Use `PyErr_SetRaisedException()` instead.

- `PyModule_GetFilename()`: Use `PyModule_GetFilenameObject()` instead.

- `PyOS_AfterFork()`: Use `PyOS_AfterFork_Child()` instead.

- `PySlice_GetIndicesEx()`: Use `PySlice_Unpack()` and `PySlice_AdjustIndices()` instead.

- `PyUnicode_AsDecodedObject()`: Use `PyCodec_Decode()` instead.

- `PyUnicode_AsDecodedUnicode()`: Use `PyCodec_Decode()` instead.

- `PyUnicode_AsEncodedObject()`: Use `PyCodec_Encode()` instead.

- `PyUnicode_AsEncodedUnicode()`: Use `PyCodec_Encode()` instead.

- `PyUnicode_READY()`: Unneeded since Python 3.12

- `PyErr_Display()`: Use `PyErr_DisplayException()` instead.

- `_PyErr_ChainExceptions()`: Use `_PyErr_ChainExceptions1()` instead.

- `PyBytesObject.ob_shash` member: call `PyObject_Hash()` instead.

- `PyDictObject.ma_version_tag` member.

- API de almacenamiento local de subprocesos (TLS):

  - `PyThread_create_key()`: Use `PyThread_tss_alloc()` instead.

  - `PyThread_delete_key()`: Use `PyThread_tss_free()` instead.

  - `PyThread_set_key_value()`: Use `PyThread_tss_set()` instead.

  - `PyThread_get_key_value()`: Use `PyThread_tss_get()` instead.

  - `PyThread_delete_key_value()`: Use `PyThread_tss_delete()` instead.

  - `PyThread_ReInitTLS()`: Unneeded since Python 3.7.

### Eliminado

- Elimine el archivo de encabezado `token.h`. Nunca hubo ninguna API C de tokenizador público. El archivo de encabezado `token.h` solo fue diseñado para ser utilizado por componentes internos de Python. (Aportado por Victor Stinner en gh-92651.)

- Se han eliminado las API Unicode heredadas. Consulte PEP 623 para obtener más detalles.

  - `PyUnicode_WCHAR_KIND`

  - `PyUnicode_AS_UNICODE()`

  - `PyUnicode_AsUnicode()`

  - `PyUnicode_AsUnicodeAndSize()`

  - `PyUnicode_AS_DATA()`

  - `PyUnicode_FromUnicode()`

  - `PyUnicode_GET_SIZE()`

  - `PyUnicode_GetSize()`

  - `PyUnicode_GET_DATA_SIZE()`

- Elimine la macro de función `PyUnicode_InternImmortal()`. (Aportado por Victor Stinner en gh-85858.)

## Notable changes in 3.12.4

### ipaddress

- Fixed `is_global` and `is_private` behavior in `IPv4Address`, `IPv6Address`, `IPv4Network` and `IPv6Network`.

## Notable changes in 3.12.5

### email

- Headers with embedded newlines are now quoted on output.

  The `generator` will now refuse to serialize (write) headers that are improperly folded or delimited, such that they would be parsed as multiple headers or joined with adjacent data. If you need to turn this safety feature off, set `verify_generated_headers`. (Contributed by Bas Bloemsaat and Petr Viktorin in gh-121650.)

## Notable changes in 3.12.6

### email

- `email.utils.getaddresses()` and `email.utils.parseaddr()` now return `('', '')` 2-tuples in more situations where invalid email addresses are encountered, instead of potentially inaccurate values. An optional strict parameter was added to these two functions: use `strict=False` to get the old behavior, accepting malformed inputs. `getattr(email.utils, 'supports_strict_parsing', False)` can be used to check if the strict paramater is available. (Contributed by Thomas Dwyer and Victor Stinner for gh-102988 to improve the CVE-2023-27043 fix.)

## Notable changes in 3.12.8

### sys

- The previously undocumented special function `sys.getobjects()`, which only exists in specialized builds of Python, may now return objects from other interpreters than the one it’s called in.

## Notable changes in 3.12.10

### os.path

- The strict parameter to `os.path.realpath()` accepts a new value, `os.path.ALLOW_MISSING`. If used, errors other than `FileNotFoundError` will be re-raised; the resulting path can be missing but it will be free of symlinks. (Contributed by Petr Viktorin for CVE 2025-4517.)

### tarfile

- `data_filter()` now normalizes symbolic link targets in order to avoid path traversal attacks. (Contributed by Petr Viktorin in gh-127987 and CVE 2025-4138.)

- `extractall()` now skips fixing up directory attributes when a directory was removed or replaced by another kind of file. (Contributed by Petr Viktorin in gh-127987 and CVE 2024-12718.)

- `extract()` and `extractall()` now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception, `LinkFallbackError`. (Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)

- `extract()` and `extractall()` no longer extract rejected members when `errorlevel()` is zero. (Contributed by Matt Prodani and Petr Viktorin in gh-112887 and CVE 2025-4435.)