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:
Nuevas características gramaticales:
Mejoras del intérprete:
PEP 669, monitorización de bajo impacto
Improved “Did you mean …” suggestions para excepciones
NameError
,ImportError
ySyntaxError
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 subclasesEl módulo
os
recibió varias mejoras para el soporte de WindowsSe ha agregado un command-line interface al módulo
sqlite3
Los controles
isinstance()
frente aruntime-checkable protocols
benefician de una aceleración de entre dos y 20 vecesEl 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:
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 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 objetostr
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 providedistutils
, if you still require it in Python 3.12 and beyond.gh-95299: No preinstala
setuptools
en entornos virtuales creados convenv
. Esto significa quedistutils
,setuptools
,pkg_resources
yeasy_install
ya no estarán disponibles de forma predeterminada; para acceder a ellos, ejecutepip install setuptools
en el entorno virtual activated.Se han eliminado los módulos
asynchat
,asyncore
yimp
, junto con variosunittest.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. */
For further examples how to use the C-API for sub-interpreters with a
per-interpreter GIL, see 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, enfor 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 unNameError
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 escribeimport x from y
en lugar defrom 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 sentenciasfrom <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'?
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 deDeprecationWarning
. Por ejemplo,re.compile("\d+\.\d+")
ahora emite unSyntaxWarning
("\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 deSyntaxWarning
. (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 unSyntaxWarning
, en lugar deDeprecationWarning
. En una futura versión de Python, eventualmente serán unSyntaxError
. (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 ab
. Tenga en cuenta que la asignación de variables almacenadas en la parte de destino de las comprensiones (comoa
) 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 unRuntimeError
. 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 elExceptionGroup
y genera otra excepción, esa excepción ya no está incluida en unExceptionGroup
. 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
yint
. (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 generaSyntaxError
en lugar deValueError
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
yshutil.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 funcionessys.activate_stack_trampoline()
,sys.deactivate_stack_trampoline()
ysys.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 usasendmsg()
si la plataforma lo admite. (Aportado por Kumar Aditya en gh-91166.)Agregado las funciones
asyncio.eager_task_factory()
yasyncio.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
usaasyncio.PidfdChildWatcher
de forma predeterminada sios.pidfd_open()
está disponible y es funcional en lugar deasyncio.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 yasyncio.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 devuelveFalse
para generadores, ya queasyncio
no admite rutinas heredadas basadas en generadores. (Aportado por Kumar Aditya en gh-102748.)asyncio.wait()
yasyncio.as_completed()
ahora aceptan generadores que generan tareas. (Aportado por Kumar Aditya en gh-78530.)
calendar¶
Agregado las enumeraciones
calendar.Month
ycalendar.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¶
Add
csv.QUOTE_NOTNULL
andcsv.QUOTE_STRINGS
flags to provide finer grained control ofNone
and empty strings byreader
andwriter
objects.
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óndis.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 withinspect.iscoroutinefunction()
. (Contributed by Carlton Gibson in gh-99247.)Agregado
inspect.getasyncgenstate()
yinspect.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 conos.pidfd_open()
en modo sin bloqueo. (Aportado por Kumar Aditya en gh-93312.)os.DirEntry
ahora incluye un métodoos.DirEntry.is_junction()
para verificar si la entrada es un cruce. (Aportado por Charles Machalow en gh-99547.)Agregado funciones
os.listdrives()
,os.listvolumes()
yos.listmounts()
en Windows para enumerar unidades, volúmenes y puntos de montaje. (Aportado por Steve Dower en gh-102519.)os.stat()
yos.lstat()
ahora son más precisos en Windows. El campost_birthtime
ahora se completará con la hora de creación del archivo, yst_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 yst_ino
hasta 128 bits dependiendo de su sistema de archivos, yst_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.)
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
ypathlib.Path
, además de sus variantes específicas de Posix y Windows. Las subclases pueden anular el métodopathlib.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 aos.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 conos.path.relpath()
. (Aportado por Domenico Ragusa en gh-84538.)Agregado
pathlib.Path.is_junction()
como proxy aos.path.isjunction()
. (Aportado por Charles Machalow en gh-99547.)Agregado el parámetro opcional case_sensitive a
pathlib.Path.glob()
,pathlib.Path.rglob()
ypathlib.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.
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
arandom.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á aNeedCurrentDirectoryForExePathW
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 dePATHEXT
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
asqlite3.Connection
y el parámetro autocommit asqlite3.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()
ysqlite3.Connection.setconfig()
asqlite3.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étodoranked
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()
ysys.deactivate_stack_trampoline()
para activar y desactivar los trampolines del perfilador de pila, ysys.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
ysys.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()
ysys.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.
threading¶
Agregado
threading.settrace_all_threads()
ythreading.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étodoscreate_*()
. (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ódulotokenize
.
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()
conruntime-checkable protocols
ahora usaninspect.getattr_static()
en lugar dehasattr()
para buscar si existen atributos. Esto significa que los descriptores y los métodos__getattr__()
ya no se evalúan inesperadamente durante las comprobaciones deisinstance()
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 againstruntime-checkable protocols
has changed significantly. Mostisinstance()
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
ytyping.NamedTuple
ahora tienen el atributo__orig_bases__
. (Aportado por Adrián García Badaracco en gh-103699.)Agregado el parámetro
frozen_default
atyping.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
ywstr_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()
yre.subn()
y los métodosre.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()
ytokenize.generate_tokens()
son hasta un 64 % más rápidas como efecto secundario de los cambios necesarios para cubrir PEP 701 en el módulotokenize
. (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ónLOAD_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 conLOAD_ATTR
.LOAD_ATTR
ahora se comportará como la antigua instrucciónLOAD_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
yJUMP_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
ySTORE_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
yLOAD_LOCALS
como parte de la implementación de PEP 695. Elimine el código de operaciónLOAD_CLASSDEREF
, que se puede reemplazar conLOAD_LOCALS
másLOAD_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 deargparse.BooleanOptionalAction
están obsoletos y se eliminarán en 3.14. (Contribución de Nikita Sobolev en gh-92248.)ast
: las siguientes características deast
han quedado obsoletas en la documentación desde Python 3.8, ahora provocan que se emita unDeprecationWarning
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.)-
Las clases de vigilancia secundaria
asyncio.MultiLoopChildWatcher
,asyncio.FastChildWatcher
,asyncio.AbstractChildWatcher
yasyncio.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()
yasyncio.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 unDeprecationWarning
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 constantescalendar.January
ycalendar.February
están obsoletas y reemplazadas porcalendar.JANUARY
ycalendar.FEBRUARY
. (Aportado por el Príncipe Roshan en gh-103636.)collections.abc
:collections.abc.ByteString
en desuso. PrefiereSequence
ocollections.abc.Buffer
. Para usar al escribir, prefiera una unión, comobytes | bytearray
ocollections.abc.Buffer
. (Aportado por Shantanu Jain en gh-91896.)datetime
:utcnow()
yutcfromtimestamp()
dedatetime.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 anow()
yfromtimestamp()
con el parámetro tz establecido endatetime.UTC
. (Aportado por Paul Ganssle en gh-103857.)email
: obsoleto el parámetro isdst enemail.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:(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 demultiprocessing
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 APIget_context()
oset_start_method()
para especificar explícitamente cuándo su código requires'fork'
. Ver contexts and start methods.pkgutil
:pkgutil.find_loader()
ypkgutil.get_loader()
están en desuso y se eliminarán en Python 3.14; utiliceimportlib.util.find_spec()
en su lugar. (Contribución de Nikita Sobolev en gh-97850.)pty
: el módulo tiene dos funcionesmaster_open()
yslave_open()
no documentadas que han quedado obsoletas desde Python 2 pero que solo obtuvieron unDeprecationWarning
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 poros.stat()
yos.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 campost_birthtime
. (Aportado por Steve Dower en gh-99726.)On POSIX platforms,
os.fork()
can now raise aDeprecationWarning
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 theos.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
oconcurrent.futures
, la solución es utilizar un método de inicio demultiprocessing
diferente, como"spawn"
o"forkserver"
.shutil
: The onerror argument ofshutil.rmtree()
is deprecated; use onexc instead. (Contributed by Irit Katriel in gh-102828.)-
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 comodict
. A partir de Python 3.14, el uso de marcadores de posición con nombre con parámetros proporcionados como una secuencia generará unProgrammingError
. (Aportado por Erlend E. Aasland en gh-101698.)
sys
: los campossys.last_type
,sys.last_value
ysys.last_traceback
están en desuso. Utilicesys.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.Hashable
andtyping.Sized
, aliases forcollections.abc.Hashable
andcollections.abc.Sized
respectively, are deprecated. (gh-94309.)typing.ByteString
, en desuso desde Python 3.9, ahora provoca que se emita unDeprecationWarning
cuando se utiliza. (Aportado por Alex Waygood en gh-91896.)
xml.etree.ElementTree
: el módulo ahora emiteDeprecationWarning
al probar el valor de verdad de unxml.etree.ElementTree.Element
. Antes, la implementación de Python emitíaFutureWarning
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()
yasync 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 wasImportWarning
). (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. Usenot
for logical negation of bools instead. In the rare case that you really need the bitwise inversion of the underlyingint
, 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 properDeprecationWarning
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 deargparse.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 aDeprecationWarning
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.)-
The child watcher classes
MultiLoopChildWatcher
,FastChildWatcher
,AbstractChildWatcher
andSafeChildWatcher
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()
yasyncio.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 unDeprecationWarning
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
: DeprecatedByteString
. PreferSequence
orBuffer
. For use in typing, prefer a union, likebytes | bytearray
, orcollections.abc.Buffer
. (Contributed by Shantanu Jain in gh-91896.)email
: Deprecated the isdst parameter inemail.utils.localtime()
. (Contributed by Alan Williams in gh-72346.)importlib.abc
deprecated classes:importlib.abc.ResourceReader
importlib.abc.Traversable
importlib.abc.TraversableResources
Utilice clases
importlib.resources.abc
en su lugar:(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 theget_context()
orset_start_method()
APIs to explicitly specify when your code requires'fork'
. See Contextos y métodos de inicio.pathlib
:is_relative_to()
andrelative_to()
: passing additional arguments is deprecated.pkgutil
:find_loader()
andget_loader()
now raiseDeprecationWarning
; useimportlib.util.find_spec()
instead. (Contributed by Nikita Sobolev in gh-97850.)pty
:master_open()
: usepty.openpty()
.slave_open()
: usepty.openpty()
.
-
version
andversion_info
.execute()
andexecutemany()
if named placeholders are used and parameters is a sequence instead of adict
.
typing
:ByteString
, deprecated since Python 3.9, now causes aDeprecationWarning
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¶
The import system:
Setting
__cached__
on a module while failing to set__spec__.cached
is deprecated. In Python 3.15,__cached__
will cease to be set or take into consideration by the import system or standard library. (gh-97879)Setting
__package__
on a module while failing to set__spec__.parent
is deprecated. In Python 3.15,__package__
will cease to be set or take into consideration by the import system or standard library. (gh-97879)
-
The undocumented
ctypes.SetPointerType()
function has been deprecated since Python 3.13.
-
The obsolete and rarely used
CGIHTTPRequestHandler
has been deprecated since Python 3.13. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.The
--cgi
flag to the python -m http.server command-line interface has been deprecated since Python 3.13.
-
The
getdefaultlocale()
function has been deprecated since Python 3.11. Its removal was originally planned for Python 3.13 (gh-90817), but has been postponed to Python 3.15. Usegetlocale()
,setlocale()
, andgetencoding()
instead. (Contributed by Hugo van Kemenade in gh-111187.)
-
PurePath.is_reserved()
has been deprecated since Python 3.13. Useos.path.isreserved()
to detect reserved paths on Windows.
-
java_ver()
has been deprecated since Python 3.13. This function is only useful for Jython support, has a confusing API, and is largely untested.
-
RLock()
will take no arguments in Python 3.15. Passing any arguments has been deprecated since Python 3.14, as the Python version does not permit any arguments, but the C version allows any number of positional or keyword arguments, ignoring every argument.
-
types.CodeType
: Accessingco_lnotab
was deprecated in PEP 626 since 3.10 and was planned to be removed in 3.12, but it only got a properDeprecationWarning
in 3.12. May be removed in 3.15. (Contributed by Nikita Sobolev in gh-101866.)
-
The undocumented keyword argument syntax for creating
NamedTuple
classes (e.g.Point = NamedTuple("Point", x=int, y=int)
) has been deprecated since Python 3.13. Use the class-based syntax or the functional syntax instead.The
typing.no_type_check_decorator()
decorator function has been deprecated since Python 3.13. After eight years in thetyping
module, it has yet to be supported by any major type checker.
wave
:The
getmark()
,setmark()
, andgetmarkers()
methods of theWave_read
andWave_write
classes have been deprecated since Python 3.13.
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.
-
The
'u'
format code (wchar_t
) has been deprecated in documentation since Python 3.3 and at runtime since Python 3.13. Use the'w'
format code (Py_UCS4
) for Unicode characters instead.
-
asyncio.iscoroutinefunction()
is deprecated and will be removed in Python 3.16, useinspect.iscoroutinefunction()
instead. (Contributed by Jiahao Li and Kumar Aditya in gh-122875.)
-
Bitwise inversion on boolean types,
~True
or~False
has been deprecated since Python 3.12, as it produces surprising and unintuitive results (-2
and-1
). Usenot x
instead for the logical negation of a Boolean. In the rare case that you need the bitwise inversion of the underlying integer, convert toint
explicitly (~int(x)
).
-
The
ExecError
exception has been deprecated since Python 3.14. It has not been used by any function inshutil
since Python 3.4, and is now an alias ofRuntimeError
.
-
The
Class.get_methods
method has been deprecated since Python 3.14.
sys
:The
_enablelegacywindowsfsencoding()
function has been deprecated since Python 3.13. Use thePYTHONLEGACYWINDOWSFSENCODING
environment variable instead.
-
The undocumented and unused
TarFile.tarfile
attribute has been deprecated since Python 3.13.
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.-
bool(NotImplemented)
.Generators:
throw(type, exc, tb)
andathrow(type, exc, tb)
signature is deprecated: usethrow(exc)
andathrow(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 keywordsand
,else
,for
,if
,in
,is
andor
. 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 ofint
.Support for
__float__()
method returning a strict subclass offloat
: these methods will be required to return an instance offloat
.Support for
__complex__()
method returning a strict subclass ofcomplex
: these methods will be required to return an instance ofcomplex
.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 constantescalendar.January
ycalendar.February
están obsoletas y reemplazadas porcalendar.JANUARY
ycalendar.FEBRUARY
. (Aportado por el Príncipe Roshan en gh-103636.)codeobject.co_lnotab
: use thecodeobject.co_lines()
method instead.-
utcnow()
: usedatetime.datetime.now(tz=datetime.UTC)
.utcfromtimestamp()
: usedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)
.
gettext
: Plural value must be an integer.-
load_module()
method: useexec_module()
instead.cache_from_source()
debug_override parameter is deprecated: use the optimization parameter instead.
-
EntryPoints
tuple interface.Implicit
None
on return values.
logging
: thewarn()
method has been deprecated since Python 3.3, usewarning()
instead.mailbox
: Use of StringIO input and text mode is deprecated, use BytesIO and binary mode instead.os
: Callingos.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
andsre_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()
andselected_npn_protocol()
are deprecated: use ALPN instead.ssl.OP_NO_SSL*
optionsssl.OP_NO_TLS*
optionsssl.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
sysconfig.is_python_build()
check_home parameter is deprecated and ignored.threading
methods:threading.Condition.notifyAll()
: usenotify_all()
.threading.Event.isSet()
: useis_set()
.threading.Thread.isDaemon()
,threading.Thread.setDaemon()
: usethreading.Thread.daemon
attribute.threading.Thread.getName()
,threading.Thread.setName()
: usethreading.Thread.name
attribute.threading.currentThread()
: usethreading.current_thread()
.threading.activeCount()
: usethreading.active_count()
.
unittest.IsolatedAsyncioTestCase
: it is deprecated to return a value that is notNone
from a test case.urllib.parse
deprecated functions:urlparse()
insteadsplitattr()
splithost()
splitnport()
splitpasswd()
splitport()
splitquery()
splittag()
splittype()
splituser()
splitvalue()
to_bytes()
urllib.request
:URLopener
andFancyURLopener
style of invoking requests is deprecated. Use newerurlopen()
functions and methods.wsgiref
:SimpleHandler.stdout.write()
should not do partial writes.xml.etree.ElementTree
: Testing the truth value of anElement
is deprecated. In a future release it will always returnTrue
. Prefer explicitlen(elem)
orelem is not None
tests instead.zipimport.zipimporter.load_module()
is deprecated: useexec_module()
instead.
Eliminado¶
asynchat y asyncore¶
configparser¶
Varios nombres obsoletos en
configparser
en 3.2 se han eliminado según gh-89336:configparser.ParsingError
ya no tiene un atributo o argumentofilename
. Utilice el atributo y el argumentosource
en su lugar.configparser
ya no tiene una claseSafeConfigParser
. Utilice en su lugar el nombreConfigParser
más corto.configparser.ConfigParser
ya no tiene un métodoreadfp
. Utiliceread_file()
en su lugar.
distutils¶
ensurepip¶
Retire la rueda de herramientas de configuración incluida en
ensurepip
y deje de instalar herramientas de configuración en entornos creados porvenv
.pip (>= 22.1)
no requiere la instalación de herramientas de configuración en el entorno. Los paquetes basados ensetuptools
(ydistutils
) aún se pueden usar conpip install
, ya que pip proporcionarásetuptools
en el entorno de compilación que utiliza para crear un paquete.easy_install
,pkg_resources
,setuptools
ydistutils
ya no se proporcionan de forma predeterminada en entornos creados convenv
o arrancados conensurepip
, ya que forman parte del paquetesetuptools
. Para proyectos que dependen de estos en tiempo de ejecución, el proyectosetuptools
debe declararse como una dependencia e instalarse por separado (generalmente, usando pip).(Aportado por Pradyun Gedam en gh-95299.)
enum¶
ftplib¶
gzip¶
Elimine el atributo
filename
delgzip.GzipFile
degzip
, en desuso desde Python 2.6; utilice el atributoname
en su lugar. En modo de escritura, el atributofilename
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
’shashlib.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 ofpbkdf2_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
yimportlib.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()
yfind_module()
. (Aportado por Barry Varsovia en gh-98040.)Se han eliminado
importlib.abc.Finder
,pkgutil.ImpImporter
ypkgutil.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
ensys.path_importer_cache
imp.cache_from_source()
imp.find_module()
imp.get_magic()
imp.get_suffixes()
importlib.machinery.SOURCE_SUFFIXES
,importlib.machinery.EXTENSION_SUFFIXES
yimportlib.machinery.BYTECODE_SUFFIXES
imp.get_tag()
imp.load_module()
imp.new_module(name)
types.ModuleType(name)
imp.reload()
imp.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¶
locale¶
Elimine la función
locale.format()
delocale
, obsoleta en Python 3.7: uselocale.format_string()
en su lugar. (Aportado por Victor Stinner en gh-94226.)
smtpd¶
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 parastr
desde Python 3.3. El código que previamente configuró la fábrica de texto enOptimizedUnicode
puede usarstr
explícitamente o confiar en el valor predeterminado que también esstr
.(Aportado por Erlend E. Aasland en gh-92548.)
ssl¶
Elimine la función
ssl.RAND_pseudo_bytes()
dessl
, obsoleta en Python 3.6: useos.urandom()
ossl.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ónssl.match_hostname()
. (Aportado por Victor Stinner en gh-94199.)Remove the
ssl.wrap_socket()
function, deprecated in Python 3.7: instead, create assl.SSLContext
object and call itsssl.SSLContext.wrap_socket
method. Any package that still usesssl.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
3.1
failIf
3.1
failUnlessEqual
3.1
failIfEqual
3.1
failUnlessAlmostEqual
3.1
failIfAlmostEqual
3.1
failUnlessRaises
3.1
assert_
3.2
assertEquals
3.2
assertNotEquals
3.2
assertAlmostEquals
3.2
assertNotAlmostEquals
3.2
assertRegexpMatches
3.2
assertRaisesRegexp
3.2
assertNotRegexpMatches
3.5
Puede utilizar https://github.com/isidentical/teyit para modernizar automáticamente sus pruebas unitarias.
Método
assertDictContainsSubset
deTestCase
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óncopy.copy()
en su lugar. La implementación C dexml.etree.ElementTree
no tiene ningún métodocopy()
, solo un método__copy__()
. (Aportado por Victor Stinner en gh-94383.)
zipimport¶
Otros¶
Elimine la regla
suspicious
de la documentaciónMakefile
yDoc/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
ysmtplib
, y los parámetros key_file, cert_file y check_hostname del módulohttp.client
, todos obsoletos desde Python 3.6. Utilice el parámetro context (ssl_context enimaplib
) 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óduloctypes
. (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 arandrange(10)
. Ahora, genera unTypeError
. Además, la excepción planteada para valores no enteros comorandrange(10.5)
orandrange('10')
se cambió deValueError
aTypeError
. Esto también evita errores en los querandrange(1e25)
seleccionaría silenciosamente de un rango mayor querandrange(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ónfromfile_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
-basedsmtpd
module deprecated in Python 3.4.7 and 3.5.4. A recommended replacement is theasyncio
-based aiosmtpd PyPI module.shlex.split()
: PasarNone
por el argumento s ahora genera una excepción, en lugar de leersys.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 tiposbytearray
ymemoryview
: solo se acepta el tipo exactobytes
para cadenas de bytes. (Aportado por Victor Stinner en gh-98393.)syslog.openlog()
ysyslog.closelog()
ahora fallan si se usan en subintérpretes.syslog.syslog()
aún se puede usar en subintérpretes, pero ahora solo sisyslog.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
oshutil.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()
ytokenize.generate_tokens()
ahora cambia debido a los cambios introducidos en PEP 701. Esto significa que los tokensSTRING
ya no se emiten para cadenas f y los tokens descritos en PEP 701 ahora se producen en su lugar:FSTRING_START
,FSTRING_MIDDLE
yFSTRING_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 ff"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 deERRORTOKEN
aOP
.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 tokensERRORTOKEN
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 returnsTrue
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 scriptconfigure
. Las extensiones están construidas porMakefile
. La mayoría de las extensiones usanpkg-config
y recurren a la detección manual. (Aportado por Christian Heimes en gh-93939.)Ahora se requiere
va_start()
con dos parámetros, comova_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
enMakefile
para anular las opciones decompileall
(predeterminada:-j0
) enmake install
. También fusionó los 3 comandoscompileall
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 dePyCode_New
)PyUnstable_Code_NewWithPosOnlyArgs()
(renombrado dePyCode_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()
yPyType_GetTypeDataSize()
para permitir el acceso a datos de instancia específicos de subclase.Se agregaron
Py_TPFLAGS_ITEMS_AT_END
yPyObject_GetItemData()
para permitir extender de forma segura ciertos tipos de tamaño variable, incluidoPyType_Type
.Se agregó
Py_RELATIVE_OFFSET
para permitir definirmembers
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 elPyType_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:
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 anulantp_call
ahora heredan el indicadorPy_TPFLAGS_HAVE_VECTORCALL
. (Aportado por Petr Viktorin en gh-93274.)The
Py_TPFLAGS_MANAGED_DICT
andPy_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:
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()
yPyEval_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 unPyFunctionObject
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()
yPyType_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()
yPyCode_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()
yPyFrame_GetVarString()
para obtener una variable de marco por su nombre. (Aportado por Victor Stinner en gh-91248.)Agregado
PyErr_GetRaisedException()
yPyErr_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 obsoletosPyErr_Fetch()
yPyErr_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()
yPyException_SetArgs()
como funciones convenientes para recuperar y modificar elargs
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 heredadaPyErr_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 objetocomo 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 conPy_BUILD_CORE
.
SSTATE_INTERNED_IMMORTAL
Un identificador para objetos Unicode internosque son inmortales.
SSTATE_INTERNED_IMMORTAL_STATIC
Un identificador para Unicode internoObjetos inmortales y estáticos.
sys.getunicodeinternedsize
Esto devuelve el número total de Unicodeobjetos 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()
yPyInterpreterConfig
, 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()
yPy_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 owchar_t*
.Las funciones de análisis de argumentos como
PyArg_ParseTuple()
ya no admiten el formato basado enPy_UNICODE*
(por ejemplo,u
,Z
). Migre a otros formatos para Unicode comos
,z
,es
yU
.tp_weaklist
para todos los tipos integrados estáticos siempre esNULL
. Este es un campo solo interno enPyTypeObject
, 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__()
(usingPyObject_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) enPyUnicode_FromFormat()
yPyUnicode_FromFormatV()
. (Aportado por Serhiy Storchaka en gh-98836.)Un carácter de formato no reconocido en
PyUnicode_FromFormat()
yPyUnicode_FromFormatV()
ahora establece unSystemError
. 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()
yPyUnicode_FromFormatV()
. (Aportado por Philip Georgi en gh-95504.)Extension classes wanting to add a
__dict__
or weak reference slot should usePy_TPFLAGS_MANAGED_DICT
andPy_TPFLAGS_MANAGED_WEAKREF
instead oftp_dictoffset
andtp_weaklistoffset
, respectively. The use oftp_dictoffset
andtp_weaklistoffset
is still supported, but does not fully support multiple inheritance (gh-95589), and performance may be worse. Classes declaringPy_TPFLAGS_MANAGED_DICT
must call_PyObject_VisitManagedDict()
and_PyObject_ClearManagedDict()
to traverse and clear their instance’s dictionaries. To clear weakrefs, callPyObject_ClearWeakRefs()
, as before.La función
PyUnicode_FSDecoder()
ya no acepta rutas de tipo bytes, como los tiposbytearray
ymemoryview
: solo se acepta el tipobytes
exacto para cadenas de bytes. (Aportado por Victor Stinner en gh-98393.)Las macros
Py_CLEAR
,Py_SETREF
yPy_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:
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 ignorantp_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 anuletp_new
(__new__()
en Python).Dado que
tp_new
anula casi todo lo que hacen las funcionesPyType_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ó atp_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
enNULL
usando el indicadorPy_TPFLAGS_DISALLOW_INSTANTIATION
. Esto lo hace aceptable para funcionesPyType_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 usandowarnings.catch_warnings()
de Python.
PyOS_InputHook
yPyOS_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 dePyLongObject
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 conPyLong_...
. Se proporcionan dos nuevas funciones API unstable para un acceso eficiente al valor dePyLongObject
s que cabe en una sola palabra de máquina: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
enPyDictObject
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_HashRandomizationFlag
: usePyConfig.use_hash_seed
yPyConfig.hash_seed
Py_LegacyWindowsFSEncodingFlag
: usePyPreConfig.legacy_windows_fs_encoding
Py_LegacyWindowsStdioFlag
: usePyConfig.legacy_windows_stdio
Py_FileSystemDefaultEncoding
: usePyConfig.filesystem_encoding
Py_HasFileSystemDefaultEncoding
: usePyConfig.filesystem_encoding
Py_FileSystemDefaultEncodeErrors
: usePyConfig.filesystem_errors
Py_UTF8Mode
: usePyPreConfig.utf8_mode
(verPy_PreInitialize()
)
La API
Py_InitializeFromConfig()
debe usarse conPyConfig
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 prefijoPy
agregado si faltara:Escriba macros como
Py_T_INT
,Py_T_DOUBLE
, etc. (anteriormenteT_INT
,T_DOUBLE
, etc.)Las banderas
Py_READONLY
(anteriormenteREADONLY
) yPy_AUDIT_READ
(anteriormente todas en mayúsculas)
Varios elementos no están expuestos desde
Python.h
:T_OBJECT
(usePy_T_OBJECT_EX
)T_NONE
(anteriormente indocumentado y bastante peculiar)La macro
WRITE_RESTRICTED
que no hace nada.Las macros
RESTRICTED
yREAD_RESTRICTED
, equivalentes aPy_AUDIT_READ
.En algunas configuraciones,
<stddef.h>
no se incluye enPython.h
. Debe incluirse manualmente cuando se utilizaoffsetof()
.
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()
yPyErr_Restore()
están en desuso. UtilicePyErr_GetRaisedException()
yPyErr_SetRaisedException()
en su lugar. (Aportado por Mark Shannon en gh-101578.)PyErr_Display()
está en desuso. UtilicePyErr_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()
oPyType_FromModuleAndSpec()
para crear una clase cuya metaclase anulatp_new
está en desuso. En su lugar, llame a la metaclase.
Eliminación pendiente en Python 3.14¶
El campo
ma_version_tag
enPyDictObject
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()
: SetPyConfig.argv
instead.PySys_SetArgv()
: SetPyConfig.argv
instead.Py_SetProgramName()
: SetPyConfig.program_name
instead.Py_SetPythonHome()
: SetPyConfig.home
instead.
La API
Py_InitializeFromConfig()
debe usarse conPyConfig
en su lugar.Variables de configuración globales:
Py_DebugFlag
: UsePyConfig.parser_debug
instead.Py_VerboseFlag
: UsePyConfig.verbose
instead.Py_QuietFlag
: UsePyConfig.quiet
instead.Py_InteractiveFlag
: UsePyConfig.interactive
instead.Py_InspectFlag
: UsePyConfig.inspect
instead.Py_OptimizeFlag
: UsePyConfig.optimization_level
instead.Py_NoSiteFlag
: UsePyConfig.site_import
instead.Py_BytesWarningFlag
: UsePyConfig.bytes_warning
instead.Py_FrozenFlag
: UsePyConfig.pathconfig_warnings
instead.Py_IgnoreEnvironmentFlag
: UsePyConfig.use_environment
instead.Py_DontWriteBytecodeFlag
: UsePyConfig.write_bytecode
instead.Py_NoUserSiteDirectory
: UsePyConfig.user_site_directory
instead.Py_UnbufferedStdioFlag
: UsePyConfig.buffered_stdio
instead.Py_HashRandomizationFlag
: UsePyConfig.use_hash_seed
andPyConfig.hash_seed
instead.Py_IsolatedFlag
: UsePyConfig.isolated
instead.Py_LegacyWindowsFSEncodingFlag
: UsePyPreConfig.legacy_windows_fs_encoding
instead.Py_LegacyWindowsStdioFlag
: UsePyConfig.legacy_windows_stdio
instead.Py_FileSystemDefaultEncoding
: UsePyConfig.filesystem_encoding
instead.Py_HasFileSystemDefaultEncoding
: UsePyConfig.filesystem_encoding
instead.Py_FileSystemDefaultEncodeErrors
: UsePyConfig.filesystem_errors
instead.Py_UTF8Mode
: UsePyPreConfig.utf8_mode
instead. (seePy_PreInitialize()
)
La API
Py_InitializeFromConfig()
debe usarse conPyConfig
en su lugar.
Eliminación pendiente en Python 3.15¶
The bundled copy of
libmpdecimal
.The
PyImport_ImportModuleNoBlock()
: UsePyImport_ImportModule()
instead.PyWeakref_GetObject()
andPyWeakref_GET_OBJECT()
: UsePyWeakref_GetRef()
instead.Py_UNICODE
type and thePy_UNICODE_WIDE
macro: Usewchar_t
instead.Funciones de inicialización de Python:
PySys_ResetWarnOptions()
: Clearsys.warnoptions
andwarnings.filters
instead.Py_GetExecPrefix()
: Getsys.base_exec_prefix
andsys.exec_prefix
instead.Py_GetPath()
: Getsys.path
instead.Py_GetPrefix()
: Getsys.base_prefix
andsys.prefix
instead.Py_GetProgramFullPath()
: Getsys.executable
instead.Py_GetProgramName()
: Getsys.executable
instead.Py_GetPythonHome()
: GetPyConfig.home
or thePYTHONHOME
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()
: UsePyErr_GetRaisedException()
instead.PyErr_NormalizeException()
: UsePyErr_GetRaisedException()
instead.PyErr_Restore()
: UsePyErr_SetRaisedException()
instead.PyModule_GetFilename()
: UsePyModule_GetFilenameObject()
instead.PyOS_AfterFork()
: UsePyOS_AfterFork_Child()
instead.PySlice_GetIndicesEx()
: UsePySlice_Unpack()
andPySlice_AdjustIndices()
instead.PyUnicode_AsDecodedObject()
: UsePyCodec_Decode()
instead.PyUnicode_AsDecodedUnicode()
: UsePyCodec_Decode()
instead.PyUnicode_AsEncodedObject()
: UsePyCodec_Encode()
instead.PyUnicode_AsEncodedUnicode()
: UsePyCodec_Encode()
instead.PyUnicode_READY()
: Unneeded since Python 3.12PyErr_Display()
: UsePyErr_DisplayException()
instead._PyErr_ChainExceptions()
: Use_PyErr_ChainExceptions1()
instead.PyBytesObject.ob_shash
member: callPyObject_Hash()
instead.PyDictObject.ma_version_tag
member.API de almacenamiento local de subprocesos (TLS):
PyThread_create_key()
: UsePyThread_tss_alloc()
instead.PyThread_delete_key()
: UsePyThread_tss_free()
instead.PyThread_set_key_value()
: UsePyThread_tss_set()
instead.PyThread_get_key_value()
: UsePyThread_tss_get()
instead.PyThread_delete_key_value()
: UsePyThread_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 encabezadotoken.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.)