Qué hay de nuevo en Python 3.11¶
- Editor:
Pablo Galindo Salgado
This article explains the new features in Python 3.11, compared to 3.10. Python 3.11 was released on October 24, 2022. For full details, see the changelog.
Resumen – Aspectos destacados de la versión¶
Python 3.11 es entre un 10 y un 60 % más rápido que Python 3.10. En promedio, medimos un aumento de velocidad de 1.25x en el conjunto de pruebas de referencia estándar. Ver CPython más rápido para más detalles.
Nuevas funciones de sintaxis:
Nuevas funciones integradas:
Nuevos módulos de biblioteca estándar:
Mejoras en el intérprete:
Nueva opción de línea de comando
-P
y variable de entornoPYTHONSAFEPATH
a disable automatically prepending potentially unsafe paths asys.path
Nuevas funciones de escritura:
Importantes depreciaciones, eliminaciones y restricciones:
Nuevas características¶
PEP 657: Ubicaciones de errores detallados en rastreos¶
Al imprimir rastreos, el intérprete ahora señalará la expresión exacta que causó el error, en lugar de solo la línea. Por ejemplo:
Traceback (most recent call last):
File "distance.py", line 11, in <module>
print(manhattan_distance(p1, p2))
^^^^^^^^^^^^^^^^^^^^^^^^^^
File "distance.py", line 6, in manhattan_distance
return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
^^^^^^^^^
AttributeError: 'NoneType' object has no attribute 'x'
Las versiones anteriores del intérprete apuntaban solo a la línea, por lo que resultaba ambiguo qué objeto era None
. Estos errores mejorados también pueden ser útiles cuando se trata de objetos dict
profundamente anidados y múltiples llamadas a funciones:
Traceback (most recent call last):
File "query.py", line 37, in <module>
magic_arithmetic('foo')
File "query.py", line 18, in magic_arithmetic
return add_counts(x) / 25
^^^^^^^^^^^^^
File "query.py", line 24, in add_counts
return 25 + query_user(user1) + query_user(user2)
^^^^^^^^^^^^^^^^^
File "query.py", line 32, in query_user
return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
~~~~~~~~~~~~~~~~~~^^^^^
TypeError: 'NoneType' object is not subscriptable
Además de expresiones aritméticas complejas:
Traceback (most recent call last):
File "calculation.py", line 54, in <module>
result = (x / y / z) * (a / b / c)
~~~~~~^~~
ZeroDivisionError: division by zero
Además, la información utilizada por la función de rastreo mejorada está disponible a través de una API general, que se puede usar para correlacionar bytecode instructions con la ubicación del código fuente. Esta información se puede recuperar usando:
El método
codeobject.co_positions()
en Python.La función
PyCode_Addr2Location()
en la API de C.
Ver PEP 657 para más detalles. (Aportado por Pablo Galindo, Batuhan Taskaya y Ammar Askar en bpo-43950.)
Nota
Esta característica requiere almacenar las posiciones de las columnas en Objetos código, lo que puede resultar en un pequeño aumento en el uso de la memoria del intérprete y el uso del disco para los archivos de Python compilados. Para evitar almacenar la información adicional y desactivar la impresión de la información de seguimiento adicional, utilice la opción de línea de comando -X no_debug_ranges
o la variable de entorno PYTHONNODEBUGRANGES
.
PEP 654: Grupos de excepción y except*
¶
PEP 654 presenta funciones de lenguaje que permiten que un programa genere y maneje múltiples excepciones no relacionadas simultáneamente. Los tipos integrados ExceptionGroup
y BaseExceptionGroup
permiten agrupar excepciones y generarlas juntas, y la nueva sintaxis except*
generaliza except
para hacer coincidir subgrupos de grupos de excepciones.
Ver PEP 654 para más detalles.
(Aportado por Irit Katriel en bpo-45292. PEP escrito por Irit Katriel, Yury Selivanov y Guido van Rossum.)
PEP 678: Las excepciones se pueden enriquecer con notas¶
El método add_note()
se agrega a BaseException
. Se puede utilizar para enriquecer las excepciones con información de contexto que no está disponible en el momento en que se genera la excepción. Las notas añadidas aparecen en el rastreo predeterminado.
Ver PEP 678 para más detalles.
(Aportado por Irit Katriel en bpo-45607. PEP escrito por Zac Hatfield-Dodds).
Mejoras en el iniciador de Windows py.exe
¶
The copy of the Lanzador de Python para Windows included with Python 3.11 has been significantly
updated. It now supports company/tag syntax as defined in PEP 514 using the
-V:<company>/<tag>
argument instead of the limited -<major>.<minor>
.
This allows launching distributions other than PythonCore
,
the one hosted on python.org.
Al usar los selectores -V:
, se puede omitir la empresa o la etiqueta, pero se buscarán todas las instalaciones. Por ejemplo, -V:OtherPython/
seleccionará la «mejor» etiqueta registrada para OtherPython
, mientras que -V:3.11
o -V:/3.11
seleccionarán la «mejor» distribución con la etiqueta 3.11
.
When using the legacy -<major>
, -<major>.<minor>
,
-<major>-<bitness>
or -<major>.<minor>-<bitness>
arguments,
all existing behaviour should be preserved from past versions,
and only releases from PythonCore
will be selected.
However, the -64
suffix now implies «not 32-bit» (not necessarily x86-64),
as there are multiple supported 64-bit platforms.
32-bit runtimes are detected by checking the runtime’s tag for a -32
suffix.
All releases of Python since 3.5 have included this in their 32-bit builds.
Otros cambios de idioma¶
Las expresiones de desempaquetado destacadas ahora se pueden usar en declaraciones
for
. (Consulte bpo-46725 para obtener más detalles).Ahora se permiten comprehensions asincrónicos dentro de las comprensiones en asynchronous functions. Las comprensiones externas implícitamente se vuelven asincrónicas en este caso. (Aportado por Serhiy Storchaka en bpo-33346.)
Ahora se genera un
TypeError
en lugar de unAttributeError
en declaracioneswith
ycontextlib.ExitStack.enter_context()
para objetos que no admiten el protocolo context manager, y en declaracionesasync with
ycontextlib.AsyncExitStack.enter_async_context()
para objetos que no admiten el protocolo asynchronous context manager. (Aportado por Serhiy Storchaka en bpo-12022 y bpo-44471).Added
object.__getstate__()
, which provides the default implementation of the__getstate__()
method.copy
ing andpickle
ing instances of subclasses of builtin typesbytearray
,set
,frozenset
,collections.OrderedDict
,collections.deque
,weakref.WeakSet
, anddatetime.tzinfo
now copies and pickles instance attributes implemented as slots. This change has an unintended side effect: It trips up a small minority of existing Python projects not expectingobject.__getstate__()
to exist. See the later comments on gh-70766 for discussions of what workarounds such code may need. (Contributed by Serhiy Storchaka in bpo-26579.)
Se agregó una opción de línea de comando
-P
y una variable de entornoPYTHONSAFEPATH
, que deshabilitan la anteposición automática asys.path
del directorio del script cuando se ejecuta un script, o el directorio actual cuando se usa-c
y-m
. Esto garantiza queimport
solo recopile la biblioteca estándar y los módulos instalados, y evita el remedo involuntario o malicioso de los módulos con los de un directorio local (y normalmente el usuario puede escribir). (Aportado por Victor Stinner en gh-57684.)Se agregó una opción
"z"
a Especificación de formato Mini-Lenguaje que cambia negativo a cero positivo después de redondear a la precisión del formato. Ver PEP 682 para más detalles. (Aportado por John Belmonte en gh-90153.)Ya no se aceptan bytes en
sys.path
. El soporte se interrumpió en algún momento entre Python 3.2 y 3.6, y nadie se dio cuenta hasta después del lanzamiento de Python 3.10.0. Además, recuperar la compatibilidad sería problemático debido a las interacciones entre-b
ysys.path_importer_cache
cuando hay una combinación de clavesstr
ybytes
. (Aportado por Thomas Grainger en gh-91181.)
Otros cambios en la implementación de CPython¶
The special methods
__complex__()
forcomplex
and__bytes__()
forbytes
are implemented to support thetyping.SupportsComplex
andtyping.SupportsBytes
protocols. (Contributed by Mark Dickinson and Donghee Na in bpo-24234.)siphash13
se agrega como un nuevo algoritmo hash interno. Tiene propiedades de seguridad similares asiphash24
, pero es un poco más rápido para entradas largas.str
,bytes
y algunos otros tipos ahora lo usan como algoritmo predeterminado parahash()
. PEP 552 hash-based .pyc files ahora también usasiphash13
. (Aportado por Inada Naoki en bpo-29410.)Cuando una declaración
raise
sin parámetros vuelve a generar una excepción activa, el rastreo adjunto a esta excepción ahora siempre essys.exc_info()[1].__traceback__
. Esto significa que los cambios realizados en el rastreo en la cláusulaexcept
actual se reflejan en la excepción que se ha vuelto a generar. (Aportado por Irit Katriel en bpo-45711.)La representación del estado del intérprete de las excepciones manejadas (también conocido como
exc_info
o_PyErr_StackItem
) ahora solo tiene el campoexc_value
; Se han eliminadoexc_type
yexc_traceback
, ya que se pueden derivar deexc_value
. (Aportado por Irit Katriel en bpo-45711.)Se ha agregado un nuevo command line option,
AppendPath
, para el instalador de Windows. Se comporta de manera similar aPrependPath
, pero agrega los directorios de instalación y scripts en lugar de anteponerlos. (Aportado por Bastian Neuburger en bpo-44934.)El campo
PyConfig.module_search_paths_set
ahora debe establecerse en1
para que la inicialización usePyConfig.module_search_paths
para inicializarsys.path
. De lo contrario, la inicialización volverá a calcular la ruta y reemplazará los valores agregados amodule_search_paths
.La salida de la opción
--help
ahora cabe en 50 líneas/80 columnas. La información sobre las opciones Python environment variables y-X
ahora está disponible utilizando los indicadores respectivos--help-env
y--help-xoptions
, y con el nuevo--help-all
. (Contribución de Éric Araujo en bpo-46142.)La conversión entre
int
ystr
en bases que no sean 2 (binario), 4, 8 (octal), 16 (hexadecimal) o 32 como base 10 (decimal) ahora genera unValueError
si el número de dígitos en forma de cadena es superior a un límite para evitar posibles ataques de denegación de servicio debido a la complejidad algorítmica. Esta es una mitigación para CVE-2020-10735. Este límite se puede configurar o deshabilitar mediante la variable de entorno, el indicador de línea de comando o las APIsys
. Consulte la documentación de integer string conversion length limitation. El límite predeterminado es de 4300 dígitos en forma de cadena.
Nuevos Módulos¶
Módulos mejorados¶
asíncio¶
Se agregó la clase
TaskGroup
, un asynchronous context manager que contiene un grupo de tareas que las esperará a todas al salir. Para código nuevo, se recomienda usarcreate_task()
ygather()
directamente. (Aportado por Yury Selivanov y otros en gh-90908.)Se agregó
timeout()
, un administrador de contexto asíncrono para establecer un tiempo de espera en operaciones asíncronas. Para código nuevo, se recomienda usarwait_for()
directamente. (Aportado por Andrew Svetlov en gh-90927.)Se agregó la clase
Runner
, que expone la maquinaria utilizada porrun()
. (Aportado por Andrew Svetlov en gh-91218.)Se agregó la clase
Barrier
a las primitivas de sincronización en la biblioteca asyncio y la excepciónBrokenBarrierError
relacionada. (Aportado por Yves Duprat y Andrew Svetlov en gh-87518.)Se agregó el argumento de palabra clave all_errors a
asyncio.loop.create_connection()
para que se puedan generar varios errores de conexión comoExceptionGroup
.Se agregó el método
asyncio.StreamWriter.start_tls()
para actualizar las conexiones basadas en secuencias existentes a TLS. (Aportado por Ian Good en bpo-34975.)Se agregaron funciones de socket de datagrama sin formato al bucle de eventos:
sock_sendto()
,sock_recvfrom()
ysock_recvfrom_into()
. Estos tienen implementaciones enSelectorEventLoop
yProactorEventLoop
. (Aportado por Alex Grönholm en bpo-46805.)Se agregaron los métodos
cancelling()
yuncancel()
aTask
. Estos están destinados principalmente para uso interno, en particular porTaskGroup
.
contextlib¶
clases de datos¶
fecha y hora¶
Add
datetime.UTC
, a convenience alias fordatetime.timezone.utc
. (Contributed by Kabir Kwatra in gh-91973.)datetime.date.fromisoformat()
,datetime.time.fromisoformat()
ydatetime.datetime.fromisoformat()
ahora se pueden usar para analizar la mayoría de los formatos ISO 8601 (excepto aquellos que admiten fracciones de horas y minutos). (Aportado por Paul Ganssle en gh-80010.)
enumeración¶
Cambió el nombre de
EnumMeta
aEnumType
(EnumMeta
se mantuvo como un alias).Se agregó
StrEnum
, con miembros que se pueden usar como (y deben ser) cadenas.Se agregó
ReprEnum
, que solo modifica el__repr__()
de los miembros mientras devuelve sus valores literales (en lugar de nombres) para__str__()
y__format__()
(utilizados porstr()
,format()
y f-strings).Changed
Enum.__format__()
(the default forformat()
,str.format()
and f-strings) to always produce the same result asEnum.__str__()
: for enums inheriting fromReprEnum
it will be the member’s value; for all other enums it will be the enum and member name (e.g.Color.RED
).Se agregó un nuevo parámetro de clase boundary a las enumeraciones
Flag
y la enumeraciónFlagBoundary
con sus opciones, para controlar cómo manejar los valores de marca fuera de rango.Se agregó el decorador de enumeración
verify()
y la enumeraciónEnumCheck
con sus opciones, para verificar las clases de enumeración contra varias restricciones específicas.Se agregaron los decoradores
member()
ynonmember()
para garantizar que el objeto decorado no se convierta en un miembro de enumeración.Se agregó el decorador
property()
, que funciona comoproperty()
excepto para las enumeraciones. Use esto en lugar detypes.DynamicClassAttribute()
.Added the
global_enum()
enum decorator, which adjusts__repr__()
and__str__()
to show values as members of their module rather than the enum class. For example,'re.ASCII'
for theASCII
member ofre.RegexFlag
rather than'RegexFlag.ASCII'
.Flag
mejorado para admitirlen()
, iteración yin
/not in
en sus miembros. Por ejemplo, ahora funciona lo siguiente:len(AFlag(3)) == 2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)
Se cambiaron
Enum
yFlag
para que los miembros ahora se definan antes de llamar a__init_subclass__()
;dir()
ahora incluye métodos, etc., de tipos de datos combinados.Se modificó
Flag
para considerar solo los valores primarios (potencia de dos) canónicos, mientras que los valores compuestos (3
,6
,10
, etc.) se consideran alias; las banderas invertidas son forzadas a su equivalente positivo.
fcntl¶
On FreeBSD, the
F_DUP2FD
andF_DUP2FD_CLOEXEC
flags respectively are supported, the former equals todup2
usage while the latter set theFD_CLOEXEC
flag in addition.
fracciones¶
Compatibilidad con la inicialización al estilo PEP 515 de
Fraction
desde una cadena. (Aportado por Sergey B Kirpichev en bpo-44258.)Fraction
ahora implementa un método__int__
, de modo que pasa una verificaciónisinstance(some_fraction, typing.SupportsInt)
. (Contribuido por Mark Dickinson en bpo-44547.)
herramientas funcionales¶
functools.singledispatch()
ahora admitetypes.UnionType
ytyping.Union
como anotaciones en el argumento de envío.:>>> from functools import singledispatch >>> @singledispatch ... def fun(arg, verbose=False): ... if verbose: ... print("Let me just say,", end=" ") ... print(arg) ... >>> @fun.register ... def _(arg: int | float, verbose=False): ... if verbose: ... print("Strength in numbers, eh?", end=" ") ... print(arg) ... >>> from typing import Union >>> @fun.register ... def _(arg: Union[list, set], verbose=False): ... if verbose: ... print("Enumerate this:") ... for i, elem in enumerate(arg): ... print(i, elem) ...
(Aportado por Yurii Karabas en bpo-46014.)
gzip¶
The
gzip.compress()
function is now faster when used with the mtime=0 argument as it delegates the compression entirely to a singlezlib.compress()
operation. There is one side effect of this change: The gzip file header contains an «OS» byte in its header. That was traditionally always set to a value of 255 representing «unknown» by thegzip
module. Now, when usingcompress()
with mtime=0, it may be set to a different value by the underlying zlib C library Python was linked against. (See gh-112346 for details on the side effect.)
hashlib¶
hashlib.blake2b()
yhashlib.blake2s()
ahora prefieren libb2 a la copia proporcionada por Python. (Aportado por Christian Heimes en bpo-47095.)El módulo interno
_sha3
con algoritmos SHA3 y SHAKE ahora usa tiny_sha3 en lugar de Keccak Code Package para reducir el código y el tamaño binario. El módulohashlib
prefiere implementaciones SHA3 y SHAKE optimizadas de OpenSSL. El cambio afecta solo a las instalaciones sin compatibilidad con OpenSSL. (Aportado por Christian Heimes en bpo-47098.)Agregue
hashlib.file_digest()
, una función de ayuda para el hash eficiente de archivos u objetos similares a archivos. (Aportado por Christian Heimes en gh-89313.)
IDLE y libre de inactividad¶
inspeccionar¶
Agregue
getmembers_static()
para devolver todos los miembros sin activar la búsqueda dinámica a través del protocolo descriptor. (Contribuido por Weipeng Hong en bpo-30533.)Agregue
ismethodwrapper()
para verificar si el tipo de un objeto esMethodWrapperType
. (Aportado por Hakan Çelik en bpo-29418.)Cambie las funciones relacionadas con el marco en el módulo
inspect
para devolver nuevas instancias de claseFrameInfo
yTraceback
(compatibles con las interfaces similares a named tuple anteriores) que incluyen la información de posición PEP 657 extendida (número de línea final, columna y columna final). Las funciones afectadas son:(Aportado por Pablo Galindo en gh-88116.)
lugar¶
Agregue
locale.getencoding()
para obtener la codificación de configuración regional actual. Es similar alocale.getpreferredencoding(False)
pero ignora Python UTF-8 Mode.
Inicio sesión¶
Se agregó
getLevelNamesMapping()
para devolver una asignación de nombres de nivel de registro (por ejemplo,'CRITICAL'
) a los valores de su Niveles de logging correspondiente (por ejemplo,50
, de forma predeterminada). (Aportado por Andrei Kulakovin en gh-88024.)Se agregó un método
createSocket()
aSysLogHandler
para que coincida conSocketHandler.createSocket()
. Se llama automáticamente durante la inicialización del controlador y cuando se emite un evento, si no hay un socket activo. (Aportado por Kirill Pinchuk en gh-88457.)
Matemáticas¶
Suma
math.exp2()
: devuelve 2 elevado a la potencia de x. (Aportado por Gideon Mitchell en bpo-45917.)Agregue
math.cbrt()
: devuelva la raíz cúbica de x. (Aportado por Ajith Ramachandran en bpo-44357.)Se cambió el comportamiento de dos casos de esquina
math.pow()
, para mantener la coherencia con la especificación IEEE 754. Las operacionesmath.pow(0.0, -math.inf)
ymath.pow(-0.0, -math.inf)
ahora devuelveninf
. Anteriormente plantearonValueError
. (Contribuido por Mark Dickinson en bpo-44339.)El valor
math.nan
ahora está siempre disponible. (Aportado por Victor Stinner en bpo-46917.)
operador¶
Se ha añadido una nueva función
operator.call
, de forma queoperator.call(obj, *args, **kwargs) == obj(*args, **kwargs)
. (Aportado por Antony Lee en bpo-44019.)
sistema operativo¶
On Windows,
os.urandom()
now usesBCryptGenRandom()
, instead ofCryptGenRandom()
which is deprecated. (Contributed by Donghee Na in bpo-44611.)As of 3.11.10,
os.mkdir()
andos.makedirs()
on Windows now support passing a mode value of0o700
to apply access control to the new directory. This implicitly affectstempfile.mkdtemp()
and is a mitigation for CVE-2024-4030. Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486.)
rutalib¶
re¶
La agrupación atómica (
(?>...)
) y los cuantificadores posesivos (*+
,++
,?+
,{m,n}+
) ahora son compatibles con las expresiones regulares. (Aportado por Jeffrey C. Jacobs y Serhiy Storchaka en bpo-433030).
cerrar¶
Agregue el parámetro opcional dir_fd en
shutil.rmtree()
. (Aportado por Serhiy Storchaka en bpo-46245.)
enchufe¶
Agregue compatibilidad con CAN Socket para NetBSD. (Aportado por Thomas Klausner en bpo-30512.)
create_connection()
tiene una opción para generar, en caso de falla de conexión, unExceptionGroup
que contiene todos los errores en lugar de generar solo el último error. (Aportado por Irit Katriel en bpo-29980.)
sqlite3¶
Ahora puede deshabilitar el autorizador pasando
None
aset_authorizer()
. (Aportado por Erlend E. Aasland en bpo-44491.)El nombre de intercalación
create_collation()
ahora puede contener cualquier carácter Unicode. Los nombres de intercalación con caracteres no válidos ahora generanUnicodeEncodeError
en lugar desqlite3.ProgrammingError
. (Aportado por Erlend E. Aasland en bpo-44688.)Las excepciones
sqlite3
ahora incluyen el código de error extendido de SQLite comosqlite_errorcode
y el nombre de error de SQLite comosqlite_errorname
. (Aportado por Aviv Palivoda, Daniel Shahaf y Erlend E. Aasland en bpo-16379 y bpo-24139).Agregue
setlimit()
ygetlimit()
asqlite3.Connection
para configurar y obtener límites de SQLite por conexión. (Aportado por Erlend E. Aasland en bpo-45243.)sqlite3
ahora establecesqlite3.threadsafety
en función del modo de subprocesamiento predeterminado con el que se ha compilado la biblioteca SQLite subyacente. (Aportado por Erlend E. Aasland en bpo-45613.)Las devoluciones de llamada de
sqlite3
C ahora usan excepciones que no se pueden generar si las devoluciones de llamada están habilitadas. Los usuarios ahora pueden registrar ununraisable hook handler
para mejorar su experiencia de depuración. (Aportado por Erlend E. Aasland en bpo-45828.)Recuperar a través de reversión ya no genera
InterfaceError
. En cambio, dejamos que la biblioteca SQLite maneje estos casos. (Aportado por Erlend E. Aasland en bpo-44092.)Agregue
serialize()
ydeserialize()
asqlite3.Connection
para serializar y deserializar bases de datos. (Aportado por Erlend E. Aasland en bpo-41930.)Agregue
create_window_function()
asqlite3.Connection
para crear funciones de ventana agregadas. (Aportado por Erlend E. Aasland en bpo-34916.)Agregue
blobopen()
asqlite3.Connection
.sqlite3.Blob
permite operaciones de E/S incrementales en blobs. (Contribuido por Aviv Palivoda y Erlend E. Aasland en bpo-24905).
cuerda¶
Agregue
get_identifiers()
yis_valid()
astring.Template
, que devuelven respectivamente todos los marcadores de posición válidos y si hay algún marcador de posición no válido presente. (Aportado por Ben Kehoe en gh-90465.)
sistema¶
sys.exc_info()
now derives thetype
andtraceback
fields from thevalue
(the exception instance), so when an exception is modified while it is being handled, the changes are reflected in the results of subsequent calls toexc_info()
. (Contributed by Irit Katriel in bpo-45711.)Agregue
sys.exception()
que devuelve la instancia de excepción activa (equivalente asys.exc_info()[1]
). (Aportado por Irit Katriel en bpo-46328.)Agregue el indicador
sys.flags.safe_path
. (Aportado por Victor Stinner en gh-57684.)
configuración del sistema¶
Se agregaron tres nuevos installation schemes (posix_venv, nt_venv y venv) y se usan cuando Python crea nuevos entornos virtuales o cuando se ejecuta desde un entorno virtual. Los primeros dos esquemas (posix_venv y nt_venv) son específicos del sistema operativo para Windows y no Windows, el venv es esencialmente un alias para uno de ellos según el sistema operativo en el que se ejecuta Python. Esto es útil para los distribuidores posteriores que modifican
sysconfig.get_preferred_scheme()
. El código de terceros que crea nuevos entornos virtuales debe usar el nuevo esquema de instalación venv para determinar las rutas, al igual quevenv
. (Aportado por Miro Hrončok en bpo-45413.)
archivo temporal¶
Los objetos
SpooledTemporaryFile
ahora implementan completamente los métodos deio.BufferedIOBase
oio.TextIOBase
(según el modo de archivo). Esto les permite trabajar correctamente con API que esperan objetos similares a archivos, como módulos de compresión. (Aportado por Carey Metcalfe en gh-70363.)As of 3.11.10 on Windows, the default mode
0o700
used bytempfile.mkdtemp()
now limits access to the new directory due to changes toos.mkdir()
. This is a mitigation for CVE-2024-4030. (Contributed by Steve Dower in gh-118486.)
enhebrar¶
On Unix, if the
sem_clockwait()
function is available in the C library (glibc 2.30 and newer), thethreading.Lock.acquire()
method now uses the monotonic clock (time.CLOCK_MONOTONIC
) for the timeout, rather than using the system clock (time.CLOCK_REALTIME
), to not be affected by system clock changes. (Contributed by Victor Stinner in bpo-41710.)
tiempo¶
En Unix,
time.sleep()
ahora usa la funciónclock_nanosleep()
onanosleep()
, si está disponible, que tiene una resolución de 1 nanosegundo (10-9 segundos), en lugar de usarselect()
que tiene una resolución de 1 microsegundo (10-6 segundos). (Aportado por Benjamin Szőke y Victor Stinner en bpo-21302.)On Windows 8.1 and newer,
time.sleep()
now uses a waitable timer based on high-resolution timers which has a resolution of 100 nanoseconds (10-7 seconds). Previously, it had a resolution of 1 millisecond (10-3 seconds). (Contributed by Benjamin Szőke, Donghee Na, Eryk Sun and Victor Stinner in bpo-21302 and bpo-45429.)
tkinter¶
Se agregó el método
info_patchlevel()
que devuelve la versión exacta de la biblioteca Tcl como una tupla con nombre similar asys.version_info
. (Aportado por Serhiy Storchaka en gh-91827.)
rastrear¶
Agregue
traceback.StackSummary.format_frame_summary()
para permitir que los usuarios anulen qué marcos aparecen en el rastreo y cómo están formateados. (Aportado por Ammar Askar en bpo-44569.)Agregue
traceback.TracebackException.print()
, que imprime la instanciaTracebackException
formateada en un archivo. (Aportado por Irit Katriel en bpo-33809.)
mecanografía¶
Para conocer los cambios importantes, consulte Nuevas funciones relacionadas con las sugerencias de tipo.
Agregue
typing.assert_never()
ytyping.Never
.typing.assert_never()
es útil para pedirle a un verificador de tipos que confirme que no se puede acceder a una línea de código. En tiempo de ejecución, genera unAssertionError
. (Aportado por Jelle Zijlstra en gh-90633.)Agregue
typing.reveal_type()
. Esto es útil para preguntarle a un verificador de tipos qué tipo ha inferido para una expresión dada. En tiempo de ejecución imprime el tipo del valor recibido. (Aportado por Jelle Zijlstra en gh-90572.)Agregue
typing.assert_type()
. Esto es útil para pedirle a un verificador de tipos que confirme que el tipo que ha inferido para una expresión dada coincide con el tipo dado. En tiempo de ejecución, simplemente devuelve el valor recibido. (Aportado por Jelle Zijlstra en gh-90638.)Los tipos
typing.TypedDict
ahora pueden ser genéricos. (Aportado por Samodya Abeysiriwardane en gh-89026.)Los tipos
NamedTuple
ahora pueden ser genéricos. (Aportado por Serhiy Storchaka en bpo-43923.)Permitir subclases de
typing.Any
. Esto es útil para evitar errores de verificación de tipos relacionados con clases altamente dinámicas, como simulacros. (Aportado por Shantanu Jain en gh-91154.)El decorador
typing.final()
ahora establece el atributo__final__
en el objeto decorado. (Aportado por Jelle Zijlstra en gh-90500.)La función
typing.get_overloads()
se puede utilizar para la introspección de las sobrecargas de una función.typing.clear_overloads()
se puede utilizar para borrar todas las sobrecargas registradas de una función. (Aportado por Jelle Zijlstra en gh-89263.)The
__init__()
method ofProtocol
subclasses is now preserved. (Contributed by Adrian Garcia Badarasco in gh-88970.)La representación de tipos de tuplas vacías (
Tuple[()]
) se simplifica. Esto afecta la introspección, p.get_args(Tuple[()])
ahora se evalúa como()
en lugar de((),)
. (Aportado por Serhiy Storchaka en gh-91137.)Afloje los requisitos de tiempo de ejecución para las anotaciones de tipo eliminando la verificación invocable en la función privada
typing._type_check
. (Aportado por Gregory Beauregard en gh-90802.)typing.get_type_hints()
ahora admite la evaluación de cadenas como referencias directas en PEP 585 generic aliases. (Aportado por Niklas Rosenstein en gh-85542.)typing.get_type_hints()
ya no agregaOptional
a los parámetros conNone
como predeterminado. (Aportado por Nikita Sobolev en gh-90353.)typing.get_type_hints()
ahora admite la evaluación de anotacionesClassVar
con cadenas desnudas. (Aportado por Gregory Beauregard en gh-90711.)typing.no_type_check()
ya no modifica clases y funciones externas. Ahora también marca correctamente los métodos de clase para que no se verifique el tipo. (Aportado por Nikita Sobolev en gh-90729.)
unicodedata¶
The Unicode database has been updated to version 14.0.0. (Contributed by Benjamin Peterson in bpo-45190).
prueba de unidad¶
Se agregaron los métodos
enterContext()
yenterClassContext()
de la claseTestCase
, el métodoenterAsyncContext()
de la claseIsolatedAsyncioTestCase
y la funciónunittest.enterModuleContext()
. (Aportado por Serhiy Storchaka en bpo-45046.)
venv¶
Cuando se crean nuevos entornos virtuales de Python, el venv sysconfig installation scheme se utiliza para determinar las rutas dentro del entorno. Cuando Python se ejecuta en un entorno virtual, el mismo esquema de instalación es el predeterminado. Eso significa que los distribuidores intermedios pueden cambiar el esquema de instalación de sysconfig predeterminado sin cambiar el comportamiento de los entornos virtuales. El código de terceros que también crea nuevos entornos virtuales debería hacer lo mismo. (Aportado por Miro Hrončok en bpo-45413.)
advertencias¶
warnings.catch_warnings()
ahora acepta argumentos parawarnings.simplefilter()
, lo que proporciona una forma más concisa de ignorar localmente las advertencias o convertirlas en errores. (Aportado por Zac Hatfield-Dodds en bpo-47074).
archivo zip¶
Se agregó compatibilidad para especificar la codificación de nombres de miembros para leer metadatos en los encabezados de archivos y directorios de
ZipFile
. (Aportado por Stephen J. Turnbull y Serhiy Storchaka en bpo-28080).Se agregó
ZipFile.mkdir()
para crear nuevos directorios dentro de archivos ZIP. (Aportado por Sam Ezeh en gh-49083.)Se agregaron
stem
,suffix
ysuffixes
azipfile.Path
. (Aportado por Miguel Brito en gh-88261.)
Optimizaciones¶
Esta sección cubre optimizaciones específicas independientes del proyecto CPython más rápido, que se trata en su propia sección.
El compilador ahora optimiza printf-style % formatting simple en cadenas literales que contienen solo los códigos de formato
%s
,%r
y%a
y lo hace tan rápido como una expresión f-string correspondiente. (Aportado por Serhiy Storchaka en bpo-28307.)La división de enteros (
//
) está mejor ajustada para la optimización por parte de los compiladores. Ahora es un 20 % más rápido en x86-64 cuando se divide unint
por un valor menor que2**30
. (Aportado por Gregory P. Smith y Tim Peters en gh-90564.)sum()
ahora es casi un 30 % más rápido para números enteros más pequeños que2**30
. (Aportado por Stefan Behnel en gh-68264.)El cambio de tamaño de las listas está simplificado para el caso común, acelerando
list.append()
en ≈15 % y list comprehensions simples hasta en un 20-30 % (Contribuido por Dennis Sweeney en gh-91165).Los diccionarios no almacenan valores hash cuando todas las claves son objetos Unicode, lo que reduce el tamaño de
dict
. Por ejemplo,sys.getsizeof(dict.fromkeys("abcdefg"))
se reduce de 352 bytes a 272 bytes (un 23 % más pequeño) en plataformas de 64 bits. (Aportado por Inada Naoki en bpo-46845.)El uso de
asyncio.DatagramProtocol
ahora es mucho más rápido cuando se transfieren archivos grandes a través de UDP, con velocidades 100 veces más altas para un archivo de ≈60 MiB. (Aportado por msoxzw en gh-91487.)Las funciones
math
comb()
yperm()
ahora son ≈10 veces más rápidas para argumentos grandes (con una aceleración mayor para k más grandes). (Aportado por Serhiy Storchaka en bpo-37295.)Las funciones
statistics
mean()
,variance()
ystdev()
ahora consumen iteradores en una sola pasada en lugar de convertirlos primero enlist
. Esto es el doble de rápido y puede ahorrar una cantidad considerable de memoria. (Aportado por Raymond Hettinger en gh-90415.)unicodedata.normalize()
now normalizes pure-ASCII strings in constant time. (Contributed by Donghee Na in bpo-44987.)
CPython más rápido¶
CPython 3.11 is an average of 25% faster than CPython 3.10 as measured with the pyperformance benchmark suite, when compiled with GCC on Ubuntu Linux. Depending on your workload, the overall speedup could be 10-60%.
This project focuses on two major areas in Python: Inicio más rápido and Tiempo de ejecución más rápido. Optimizations not covered by this project are listed separately under Optimizaciones.
Inicio más rápido¶
Importaciones congeladas / Objetos de código estático¶
Python caches bytecode in the __pycache__ directory to speed up module loading.
Previamente en 3.10, la ejecución del módulo de Python se veía así:
Read __pycache__ -> Unmarshal -> Heap allocated code object -> Evaluate
In Python 3.11, the core modules essential for Python startup are «frozen». This means that their Objetos código (and bytecode) are statically allocated by the interpreter. This reduces the steps in module execution process to:
Statically allocated code object -> Evaluate
El inicio del intérprete ahora es un 10-15 % más rápido en Python 3.11. Esto tiene un gran impacto para los programas de ejecución corta que usan Python.
(Contributed by Eric Snow, Guido van Rossum and Kumar Aditya in many issues.)
Tiempo de ejecución más rápido¶
Marcos de Python más baratos y perezosos¶
Python frames, holding execution information, are created whenever Python calls a Python function. The following are new frame optimizations:
Simplificó el proceso de creación de marcos.
Se evitó la asignación de memoria al reutilizar generosamente el espacio de marcos en la pila C.
Simplificó la estructura del marco interno para que contenga solo información esencial. Los marcos contenían previamente información adicional de gestión de memoria y depuración.
Old-style frame objects
are now created only when requested by debuggers
or by Python introspection functions such as sys._getframe()
and
inspect.currentframe()
. For most user code, no frame objects are
created at all. As a result, nearly all Python functions calls have sped
up significantly. We measured a 3-7% speedup in pyperformance.
(Aportado por Mark Shannon en bpo-44590.)
Llamadas a funciones de Python en línea¶
Durante una llamada de función de Python, Python llamará a una función C de evaluación para interpretar el código de esa función. Esto limita efectivamente la recursión pura de Python a lo que es seguro para la pila de C.
En 3.11, cuando CPython detecta código de Python que llama a otra función de Python, configura un nuevo marco y «salta» al nuevo código dentro del nuevo marco. Esto evita llamar a la función de interpretación de C por completo.
Most Python function calls now consume no C stack space, speeding them up.
In simple recursive functions like fibonacci or
factorial, we observed a 1.7x speedup. This also means recursive functions
can recurse significantly deeper
(if the user increases the recursion limit with sys.setrecursionlimit()
).
We measured a 1-3% improvement in pyperformance.
(Aportado por Pablo Galindo y Mark Shannon en bpo-45256.)
PEP 659: Intérprete Adaptativo Especializado¶
PEP 659 is one of the key parts of the Faster CPython project. The general idea is that while Python is a dynamic language, most code has regions where objects and types rarely change. This concept is known as type stability.
At runtime, Python will try to look for common patterns and type stability in the executing code. Python will then replace the current operation with a more specialized one. This specialized operation uses fast paths available only to those use cases/types, which generally outperform their generic counterparts. This also brings in another concept called inline caching, where Python caches the results of expensive operations directly in the bytecode.
The specializer will also combine certain common instruction pairs into one superinstruction, reducing the overhead during execution.
Python will only specialize when it sees code that is «hot» (executed multiple times). This prevents Python from wasting time on run-once code. Python can also de-specialize when code is too dynamic or when the use changes. Specialization is attempted periodically, and specialization attempts are not too expensive, allowing specialization to adapt to new circumstances.
(PEP escrito por Mark Shannon, con ideas inspiradas por Stefan Brunthaler. Consulte PEP 659 para obtener más información. Implementación por Mark Shannon y Brandt Bucher, con ayuda adicional de Irit Katriel y Dennis Sweeney).
Operación |
Forma |
Especialización |
Aceleración de la operación (hasta) |
Colaborador(es) |
---|---|---|---|---|
Operaciones binarias |
|
Binary add, multiply and subtract for common types
such as |
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
Subíndice |
|
Subscripting container types such as Subscripting custom |
10-25% |
Irit KatrielMark Shannon |
Almacenar subíndice |
|
Similar a la especialización de subíndices anterior. |
10-25% |
dennis sweeney |
Llamadas |
|
Calls to common builtin (C) functions and types such
as |
20% |
Mark ShannonKen Jin |
Cargar variable global |
|
El índice del objeto en el espacio de nombres globales/integrados se almacena en caché. La carga de globales e integrados requiere cero búsquedas de espacios de nombres. |
marca shannon |
|
Cargar atributo |
|
Similar a cargar variables globales. El índice del atributo dentro del espacio de nombres de la clase/objeto se almacena en caché. En la mayoría de los casos, la carga de atributos requerirá cero búsquedas de espacios de nombres. |
marca shannon |
|
Cargar métodos para llamar |
|
La dirección real del método se almacena en caché. La carga de métodos ahora no tiene búsquedas de espacio de nombres, incluso para clases con largas cadenas de herencia. |
10-20% |
Ken JinMark Shannon |
Atributo de la tienda |
|
Similar a la optimización de atributos de carga. |
2% en rendimiento |
marca shannon |
Secuencia de desempaquetado |
|
Specialized for common containers such as
|
8% |
brandt bucher |
Varios¶
Los objetos ahora requieren menos memoria debido a los espacios de nombres de objetos creados con pereza. Sus diccionarios de espacio de nombres ahora también comparten claves más libremente. (Contribuido por Mark Shannon en bpo-45340 y bpo-40116).
«Zero-cost» exceptions are implemented, eliminating the cost of
try
statements when no exception is raised. (Contributed by Mark Shannon in bpo-40222.)Una representación más concisa de las excepciones en el intérprete redujo el tiempo necesario para detectar una excepción en aproximadamente un 10 %. (Aportado por Irit Katriel en bpo-45711.)
re
’s regular expression matching engine has been partially refactored, and now uses computed gotos (or «threaded code») on supported platforms. As a result, Python 3.11 executes the pyperformance regular expression benchmarks up to 10% faster than Python 3.10. (Contributed by Brandt Bucher in gh-91404.)
Preguntas más frecuentes¶
How should I write my code to utilize these speedups?¶
Write Pythonic code that follows common best practices; you don’t have to change your code. The Faster CPython project optimizes for common code patterns we observe.
Will CPython 3.11 use more memory?¶
Maybe not; we don’t expect memory use to exceed 20% higher than 3.10. This is offset by memory optimizations for frame objects and object dictionaries as mentioned above.
I don’t see any speedups in my workload. Why?¶
Certain code won’t have noticeable benefits. If your code spends most of its time on I/O operations, or already does most of its computation in a C extension library like NumPy, there won’t be significant speedups. This project currently benefits pure-Python workloads the most.
Además, las cifras de pyperformance son una media geométrica. Incluso dentro de los puntos de referencia de pyrendimiento, ciertos puntos de referencia se han ralentizado ligeramente, mientras que otros se han acelerado casi 2 veces.
Is there a JIT compiler?¶
No. We’re still exploring other optimizations.
Sobre¶
Faster CPython explora optimizaciones para CPython. El equipo principal está financiado por Microsoft para trabajar en esto a tiempo completo. Pablo Galindo Salgado también está financiado por Bloomberg LP para trabajar en el proyecto a tiempo parcial. Finalmente, muchos contribuyentes son voluntarios de la comunidad.
Cambios en el código de bytes de CPython¶
El código de bytes ahora contiene entradas de caché en línea, que toman la forma de las instrucciones CACHE
recién agregadas. Muchos códigos de operación esperan ser seguidos por una cantidad exacta de cachés e indican al intérprete que los omita en tiempo de ejecución. Los cachés poblados pueden parecer instrucciones arbitrarias, por lo que se debe tener mucho cuidado al leer o modificar el código de bytes adaptativo sin procesar que contiene datos acelerados.
Nuevos códigos de operación¶
ASYNC_GEN_WRAP
,RETURN_GENERATOR
ySEND
, utilizados en generadores y co-rutinas.COPY_FREE_VARS
, que evita la necesidad de un código especial del lado de la persona que llama para los cierres.JUMP_BACKWARD_NO_INTERRUPT
, para usar en ciertos bucles donde no es deseable manejar interrupciones.MAKE_CELL
, para crear Objetos celda.CHECK_EG_MATCH
yPREP_RERAISE_STAR
, para manejar el new exception groups and except* agregado en PEP 654.PUSH_EXC_INFO
, para uso en controladores de excepciones.RESUME
, no operativo, para el seguimiento interno, la depuración y las comprobaciones de optimización.
Códigos de operación reemplazados¶
Códigos de operación reemplazados |
Nuevos códigos de operación |
notas |
---|---|---|
BINARY_* INPLACE_* |
Reemplazó todos los códigos de operación numéricos binarios/en el lugar con un solo código de operación |
|
CALL_FUNCTION CALL_FUNCTION_KW CALL_METHOD |
Separa el cambio de argumentos para métodos del manejo de argumentos de palabras clave; permite una mejor especialización de las llamadas |
|
DUP_TOP DUP_TOP_TWO ROT_TWO ROT_THREE ROT_FOUR ROT_N |
Instrucciones de manipulación de pilas |
|
JUMP_IF_NOT_EXC_MATCH |
Ahora realiza la comprobación pero no salta. |
|
JUMP_ABSOLUTE POP_JUMP_IF_FALSE POP_JUMP_IF_TRUE |
Ver [3]; Variantes |
|
SETUP_WITH SETUP_ASYNC_WITH |
Configuración del bloque |
Todos los códigos de operación de salto ahora son relativos, incluidos los JUMP_IF_TRUE_OR_POP
y JUMP_IF_FALSE_OR_POP
existentes. El argumento ahora es un desplazamiento de la instrucción actual en lugar de una ubicación absoluta.
Códigos de operación cambiados/eliminados¶
Se cambiaron
MATCH_CLASS
yMATCH_KEYS
para que ya no envíen un valor booleano adicional para indicar éxito/fracaso. En su lugar, se insertaNone
en caso de error en lugar de la tupla de valores extraídos.Se cambiaron los códigos de operación que funcionan con excepciones para reflejarlas y ahora se representan como un elemento en la pila en lugar de tres (ver gh-89874).
Se eliminaron
COPY_DICT_WITHOUT_KEYS
,GEN_START
,POP_BLOCK
,SETUP_FINALLY
yYIELD_FROM
.
Obsoleto¶
Esta sección enumera las API de Python que han quedado obsoletas en Python 3.11.
Las API de C en desuso son listed separately.
Idioma/Construidos¶
El encadenamiento de descriptores
classmethod
(introducido en bpo-19072) ahora está en desuso. Ya no se puede usar para envolver otros descriptores comoproperty
. El diseño central de esta función tenía fallas y causó una serie de problemas posteriores. Para «transmitir» unclassmethod
, considere usar el atributo__wrapped__
que se agregó en Python 3.10. (Aportado por Raymond Hettinger en gh-89519.)Los escapes octales en cadenas y bytes literales con valores mayores que
0o377
(255 en decimal) ahora producen unDeprecationWarning
. En una futura versión de Python, generarán unSyntaxWarning
y eventualmente unSyntaxError
. (Aportado por Serhiy Storchaka en gh-81548.)La delegación de
int()
a__trunc__()
ahora está obsoleta. Llamar aint(a)
cuandotype(a)
implementa__trunc__()
pero no__int__()
o__index__()
ahora genera unDeprecationWarning
. (Aportado por Zackery Spytz en bpo-44977).
Módulos¶
PEP 594 condujo a la desaprobación de los siguientes módulos programados para su eliminación en Python 3.13:
(Aportado por Brett Cannon en bpo-47061 y Victor Stinner en gh-68966).
The
asynchat
,asyncore
andsmtpd
modules have been deprecated since at least Python 3.6. Their documentation and deprecation warnings have now been updated to note they will be removed in Python 3.12. (Contributed by Hugo van Kemenade in bpo-47022.)El paquete
lib2to3
y la herramienta 2to3 ahora están obsoletos y es posible que no puedan analizar Python 3.10 o posterior. Consulte PEP 617, que presenta el nuevo analizador PEG, para obtener más información. (Aportado por Victor Stinner en bpo-40360.)Los módulos no documentados
sre_compile
,sre_constants
ysre_parse
ahora están obsoletos. (Aportado por Serhiy Storchaka en bpo-47152.)
Biblioteca estándar¶
The following have been deprecated in
configparser
since Python 3.2. Their deprecation warnings have now been updated to note they will be removed in Python 3.12:la clase
configparser.SafeConfigParser
la propiedad
configparser.ParsingError.filename
the
configparser.RawConfigParser.readfp()
method
(Aportado por Hugo van Kemenade en bpo-45173.)
configparser.LegacyInterpolation
ha quedado obsoleto en la cadena de documentación desde Python 3.2 y no aparece en la documentación deconfigparser
. Ahora emite unDeprecationWarning
y se eliminará en Python 3.13. Utiliceconfigparser.BasicInterpolation
oconfigparser.ExtendedInterpolation
en su lugar. (Aportado por Hugo van Kemenade en bpo-46607.)El conjunto anterior de funciones
importlib.resources
quedó en desuso en favor de los reemplazos agregados en Python 3.9 y se eliminará en una versión futura de Python, debido a que no admite recursos ubicados dentro de los subdirectorios del paquete:The
locale.getdefaultlocale()
function is deprecated and will be removed in Python 3.15. Uselocale.setlocale()
,locale.getpreferredencoding(False)
andlocale.getlocale()
functions instead. (Contributed by Victor Stinner in gh-90817.)La función
locale.resetlocale()
está en desuso y se eliminará en Python 3.13. Utilicelocale.setlocale(locale.LC_ALL, "")
en su lugar. (Aportado por Victor Stinner en gh-90817.)Ahora se aplicarán reglas más estrictas para las referencias de grupos numéricos y los nombres de grupos en regular expressions. Ahora solo se aceptarán secuencias de dígitos ASCII como referencia numérica, y el nombre del grupo en los patrones
bytes
y las cadenas de reemplazo solo pueden contener letras ASCII, dígitos y guiones bajos. Por ahora, se genera una advertencia de desaprobación para la sintaxis que viola estas reglas. (Aportado por Serhiy Storchaka en gh-91760.)In the
re
module, there.template()
function and the correspondingre.TEMPLATE
andre.T
flags are deprecated, as they were undocumented and lacked an obvious purpose. They will be removed in Python 3.13. (Contributed by Serhiy Storchaka and Miro Hrončok in gh-92728.)turtle.settiltangle()
está en desuso desde Python 3.1; ahora emite una advertencia de desaprobación y se eliminará en Python 3.13. Utiliceturtle.tiltangle()
en su lugar (anteriormente se marcó incorrectamente como obsoleto y su cadena de documentación ahora está corregida). (Aportado por Hugo van Kemenade en bpo-45837.)typing.Text
, que existe únicamente para proporcionar soporte de compatibilidad entre el código de Python 2 y Python 3, ahora está obsoleto. Su eliminación no está planificada actualmente, pero se recomienda a los usuarios que usenstr
en su lugar siempre que sea posible. (Aportado por Alex Waygood en gh-92332.)La sintaxis de argumento de palabra clave para construir tipos
typing.TypedDict
ahora está obsoleta. Se eliminará el soporte en Python 3.13. (Aportado por Jingchen Ye en gh-90224.)webbrowser.MacOSX
is deprecated and will be removed in Python 3.13. It is untested, undocumented, and not used bywebbrowser
itself. (Contributed by Donghee Na in bpo-42255.)El comportamiento de devolver un valor de los métodos de prueba
TestCase
yIsolatedAsyncioTestCase
(aparte del valorNone
predeterminado) ahora está obsoleto.Se descartaron las siguientes funciones
unittest
no documentadas formalmente, programadas para su eliminación en Python 3.13:unittest.findTestCases()
unittest.makeSuite()
unittest.getTestCaseNames()
Utilice métodos
TestLoader
en su lugar:(Aportado por Erlend E. Aasland en bpo-5846.)
unittest.TestProgram.usageExit()
is marked deprecated, to be removed in 3.13. (Contributed by Carlos Damázio in gh-67048.)
Eliminación pendiente en Python 3.12¶
Las siguientes API de Python han quedado obsoletas en versiones anteriores de Python y se eliminarán en Python 3.12.
Las API de C pendientes de eliminación son listed separately.
The
asynchat
moduleThe
asyncore
moduleThe
imp
moduleThe
typing.io
namespaceThe
typing.re
namespacecgi.log()
importlib.machinery.BuiltinImporter.find_module()
importlib.machinery.BuiltinLoader.module_repr()
importlib.machinery.FileFinder.find_loader()
importlib.machinery.FileFinder.find_module()
importlib.machinery.FrozenImporter.find_module()
importlib.machinery.FrozenLoader.module_repr()
importlib.machinery.WindowsRegistryFinder.find_module()
importlib.util.set_loader_wrapper()
importlib.util.set_package_wrapper()
sqlite3.enable_shared_cache()
sqlite3.OptimizedUnicode()
PYTHONTHREADDEBUG
environment variableThe following deprecated aliases in
unittest
:Deprecated alias
Method Name
Deprecated in
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
Remoto¶
This section lists Python APIs that have been removed in Python 3.11.
Las API C eliminadas son listed separately.
Se eliminó
@asyncio.coroutine()
decorator, lo que permite que las corrutinas basadas en generadores heredados sean compatibles con el códigoasync
/await
. La función ha quedado obsoleta desde Python 3.8 y la eliminación se programó inicialmente para Python 3.10. Utiliceasync def
en su lugar. (Aportado por Illia Volochii en bpo-43216.)Se eliminó
asyncio.coroutines.CoroWrapper
utilizado para envolver objetos de corrutina basados en generadores heredados en el modo de depuración. (Aportado por Illia Volochii en bpo-43216.)Debido a importantes problemas de seguridad, el parámetro reuse_address de
asyncio.loop.create_datagram_endpoint()
, deshabilitado en Python 3.9, ahora se eliminó por completo. Esto se debe al comportamiento de la opción de socketSO_REUSEADDR
en UDP. (Aportado por Hugo van Kemenade en bpo-45129.)Se eliminó el módulo
binhex
, obsoleto en Python 3.9. También se eliminaron las funcionesbinascii
relacionadas y obsoletas de manera similar:binascii.a2b_hqx()
binascii.b2a_hqx()
binascii.rlecode_hqx()
binascii.rldecode_hqx()
La función
binascii.crc_hqx()
permanece disponible.(Aportado por Victor Stinner en bpo-45085.)
Se eliminó el comando
distutils
bdist_msi
en desuso en Python 3.9. Utilicebdist_wheel
(paquetes de ruedas) en su lugar. (Aportado por Hugo van Kemenade en bpo-45124.)Se eliminaron los métodos
__getitem__()
dexml.dom.pulldom.DOMEventStream
,wsgiref.util.FileWrapper
yfileinput.FileInput
, obsoletos desde Python 3.9. (Aportado por Hugo van Kemenade en bpo-45132.)Removed the deprecated
gettext
functionslgettext()
,ldgettext()
,lngettext()
andldngettext()
. Also removed thebind_textdomain_codeset()
function, theNullTranslations.output_charset()
andNullTranslations.set_output_charset()
methods, and the codeset parameter oftranslation()
andinstall()
, since they are only used for thel*gettext()
functions. (Contributed by Donghee Na and Serhiy Storchaka in bpo-44235.)Eliminado del módulo
inspect
:La función
getargspec()
, en desuso desde Python 3.0; utiliceinspect.signature()
oinspect.getfullargspec()
en su lugar.La función
formatargspec()
, obsoleta desde Python 3.5; use la funcióninspect.signature()
o el objetoinspect.Signature
directamente.Los métodos
Signature.from_builtin()
ySignature.from_function()
no documentados, obsoletos desde Python 3.5; utilice el métodoSignature.from_callable()
en su lugar.
(Aportado por Hugo van Kemenade en bpo-45320.)
Se eliminó el método
__class_getitem__()
depathlib.PurePath
, porque no se usó y se agregó por error en versiones anteriores. (Aportado por Nikita Sobolev en bpo-46483.)Removed the
MailmanProxy
class in thesmtpd
module, as it is unusable without the externalmailman
package. (Contributed by Donghee Na in bpo-35800.)Se eliminó el método obsoleto
split()
de_tkinter.TkappType
. (Aportado por Erlend E. Aasland en bpo-38371.)Se eliminó la compatibilidad con el paquete de espacio de nombres del descubrimiento
unittest
. Se introdujo en Python 3.4 pero se rompió desde Python 3.7. (Aportado por Inada Naoki en bpo-23882.)Se eliminó el método
float.__set_format__()
privado no documentado, anteriormente conocido comofloat.__setformat__()
en Python 3.7. Su cadena de documentación decía: «Probablemente no desee utilizar esta función. Existe principalmente para ser utilizada en el conjunto de pruebas de Python». (Aportado por Victor Stinner en bpo-46852.)El indicador de configuración
--experimental-isolated-subinterpreters
(y la macroEXPERIMENTAL_ISOLATED_SUBINTERPRETERS
correspondiente) se han eliminado.Pynche — El editor de tonos y colores naturales de Python — se ha sacado de
Tools/scripts
y es being developed independently del árbol de fuentes de Python.
Migración a Python 3.11¶
Esta sección enumera los cambios descritos anteriormente y otras correcciones de errores en la API de Python que pueden requerir cambios en su código de Python.
Las notas de portabilidad para la API de C son listed separately.
open()
,io.open()
,codecs.open()
yfileinput.FileInput
ya no aceptan'U'
(«nueva línea universal») en el modo de archivo. En Python 3, el modo «nueva línea universal» se usa de forma predeterminada cada vez que se abre un archivo en modo de texto, y el indicador'U'
ha quedado obsoleto desde Python 3.3. El newline parameter para estas funciones controla cómo funcionan las nuevas líneas universales. (Aportado por Victor Stinner en bpo-37330.)Las posiciones de los nodos
ast.AST
ahora se validan cuando se proporcionan acompile()
y otras funciones relacionadas. Si se detectan posiciones no válidas, se generará unValueError
. (Aportado por Pablo Galindo en gh-93351)Prohibido pasar ejecutores que no sean
concurrent.futures.ThreadPoolExecutor
aasyncio.loop.set_default_executor()
luego de una obsolescencia en Python 3.8. (Aportado por Illia Volochii en bpo-43234.)calendar
: las clasescalendar.LocaleTextCalendar
ycalendar.LocaleHTMLCalendar
ahora usanlocale.getlocale()
, en lugar de usarlocale.getdefaultlocale()
, si no se especifica una configuración regional. (Aportado por Victor Stinner en bpo-46659.)El módulo
pdb
ahora lee el archivo de configuración.pdbrc
con la codificación'UTF-8'
. (Contribuido por Srinivas Reddy Thatiparthy (శ్రీనివాస్ రెడ్డి తాటిపర్తి) en bpo-41137.)El parámetro population de
random.sample()
debe ser una secuencia y ya no se admite la conversión automática deset
s alist
s. Además, si el tamaño de la muestra es mayor que el tamaño de la población, se genera unValueError
. (Aportado por Raymond Hettinger en bpo-40465.)Se eliminó el parámetro opcional random de
random.shuffle()
. Anteriormente, era una función aleatoria arbitraria para usar en la reproducción aleatoria; ahora, siempre se utilizarárandom.random()
(su valor predeterminado anterior).En
re
Sintaxis de expresiones regulares, las banderas en línea globales (por ejemplo,(?i)
) ahora solo se pueden usar al comienzo de las expresiones regulares. Su uso en otros lugares ha quedado obsoleto desde Python 3.6. (Aportado por Serhiy Storchaka en bpo-47066.)En el módulo
re
, se corrigieron varios errores antiguos que, en casos excepcionales, podían hacer que los grupos de captura obtuvieran un resultado incorrecto. Por lo tanto, esto podría cambiar la salida capturada en estos casos. (Contribuido por Ma Lin en bpo-35859.)
Construir cambios¶
CPython ahora tiene PEP 11 Tier 3 support para la compilación cruzada en las plataformas WebAssembly Emscripten (
wasm32-unknown-emscripten
, es decir, Python en el navegador) y WebAssembly System Interface (WASI) (wasm32-unknown-wasi
). El esfuerzo está inspirado en trabajos anteriores como Pyodide. Estas plataformas proporcionan un subconjunto limitado de API POSIX; Las funciones y módulos de las bibliotecas estándar de Python relacionadas con redes, procesos, subprocesos, señales, mmap y usuarios/grupos no están disponibles o no funcionan. (Escritos aportados por Christian Heimes y Ethan Smith en gh-84461 y WASI aportados por Christian Heimes en gh-90473; plataformas promocionadas en gh-95085)Building CPython now requires:
The
Py_NO_NAN
macro has been removed. Since CPython now requires IEEE 754 floats, NaN values are always available. (Contributed by Victor Stinner in bpo-46656.)El paquete
tkinter
ahora requiere Tcl/Tk versión 8.5.12 o posterior. (Aportado por Serhiy Storchaka en bpo-46996.)Las dependencias de compilación, los indicadores del compilador y los indicadores del vinculador para la mayoría de los módulos de extensión stdlib ahora son detectados por configure. pkg-config detecta los indicadores libffi, libnsl, libsqlite3, zlib, bzip2, liblzma, libcrypt, Tcl/Tk y uuid (si están disponibles).
tkinter
ahora requiere un comando pkg-config para detectar configuraciones de desarrollo para encabezados y bibliotecas Tcl/Tk. (Aportado por Christian Heimes y Erlend Egeberg Aasland en bpo-45847, bpo-45747 y bpo-45763).libpython ya no está vinculado con libcrypt. (Aportado por Mike Gilbert en bpo-45433.)
CPython can now be built with the ThinLTO option via passing
thin
to--with-lto
, i.e.--with-lto=thin
. (Contributed by Donghee Na and Brett Holman in bpo-44340.)Las listas libres para estructuras de objetos ahora se pueden deshabilitar. Se puede usar una nueva opción configure
--without-freelists
para deshabilitar todas las listas libres excepto el singleton de tupla vacío. (Aportado por Christian Heimes en bpo-45522.)Modules/Setup
yModules/makesetup
se han mejorado y atado. Los módulos de extensión ahora se pueden construir a través demakesetup
. Todos, excepto algunos módulos de prueba, se pueden vincular estáticamente a una biblioteca o binario principal. (Aportado por Brett Cannon y Christian Heimes en bpo-45548, bpo-45570, bpo-45571 y bpo-43974).Nota
Utilice las variables de entorno
TCLTK_CFLAGS
yTCLTK_LIBS
para especificar manualmente la ubicación de los encabezados y bibliotecas Tcl/Tk. Se han eliminado las opciones configure--with-tcltk-includes
y--with-tcltk-libs
.En RHEL 7 y CentOS 7, los paquetes de desarrollo no proporcionan
tcl.pc
ytk.pc
; usaTCLTK_LIBS="-ltk8.5 -ltkstub8.5 -ltcl8.5"
. El directorioMisc/rhel7
contiene archivos.pc
e instrucciones sobre cómo compilar Python con Tcl/Tk y OpenSSL de RHEL 7 y CentOS 7.CPython ahora usará dígitos de 30 bits de manera predeterminada para la implementación de Python
int
. Anteriormente, el valor predeterminado era usar dígitos de 30 bits en plataformas conSIZEOF_VOID_P >= 8
y dígitos de 15 bits en caso contrario. Todavía es posible solicitar explícitamente el uso de dígitos de 15 bits a través de la opción--enable-big-digits
en el script de configuración o (para Windows) la variablePYLONG_BITS_IN_DIGIT
enPC/pyconfig.h
, pero es posible que esta opción se elimine en algún momento en el futuro. (Contribuido por Mark Dickinson en bpo-45569.)
Cambios en la API de C¶
Nuevas características¶
Agregue una nueva función
PyType_GetName()
para obtener el nombre corto del tipo. (Aportado por Hai Shi en bpo-42035.)Agregue una nueva función
PyType_GetQualName()
para obtener el nombre completo del tipo. (Aportado por Hai Shi en bpo-42035.)Agregue nuevas funciones
PyThreadState_EnterTracing()
yPyThreadState_LeaveTracing()
a la API de C limitada para suspender y reanudar el seguimiento y la creación de perfiles. (Aportado por Victor Stinner en bpo-43760.)Se agregó la constante
Py_Version
que tiene el mismo valor quePY_VERSION_HEX
. (Aportado por Gabriele N. Tornetta en bpo-43931.)Py_buffer
y las API ahora forman parte de la API limitada y la ABI estable:Ranuras de tipo
bf_getbuffer
ybf_releasebuffer
(Aportado por Christian Heimes en bpo-45459.)
Added the
PyType_GetModuleByDef()
function, used to get the module in which a method was defined, in cases where this information is not available directly (viaPyCMethod
). (Contributed by Petr Viktorin in bpo-46613.)Agrega nuevas funciones para empaquetar y desempaquetar C doble (serializar y deserializar):
PyFloat_Pack2()
,PyFloat_Pack4()
,PyFloat_Pack8()
,PyFloat_Unpack2()
,PyFloat_Unpack4()
yPyFloat_Unpack8()
. (Aportado por Victor Stinner en bpo-46906.)Agregue nuevas funciones para obtener atributos de objetos de marco:
PyFrame_GetBuiltins()
,PyFrame_GetGenerator()
,PyFrame_GetGlobals()
,PyFrame_GetLasti()
.Se agregaron dos funciones nuevas para obtener y configurar la instancia de excepción activa:
PyErr_GetHandledException()
yPyErr_SetHandledException()
. Estas son alternativas aPyErr_SetExcInfo()
yPyErr_GetExcInfo()
que funcionan con la representación de excepciones heredada de 3 tuplas. (Aportado por Irit Katriel en bpo-46343.)Se agregó el miembro
PyConfig.safe_path
. (Aportado por Victor Stinner en gh-57684.)
Migración a Python 3.11¶
Algunas macros se han convertido en funciones estáticas en línea para evitar macro pitfalls. El cambio debería ser en su mayoría transparente para los usuarios, ya que las funciones de reemplazo emitirán sus argumentos a los tipos esperados para evitar advertencias del compilador debido a comprobaciones de tipos estáticos. Sin embargo, cuando la API de C limitada se establece en >=3.11, estas conversiones no se realizan y las personas que llaman deberán convertir argumentos a sus tipos esperados. Ver PEP 670 para más detalles. (Aportado por Victor Stinner y Erlend E. Aasland en gh-89653.)
PyErr_SetExcInfo()
ya no usa los argumentostype
ytraceback
, el intérprete ahora deriva esos valores de la instancia de excepción (el argumentovalue
). La función aún roba referencias de los tres argumentos. (Aportado por Irit Katriel en bpo-45711.)PyErr_GetExcInfo()
ahora deriva los campostype
ytraceback
del resultado de la instancia de excepción (el campovalue
). (Aportado por Irit Katriel en bpo-45711.)_frozen
tiene un nuevo campois_package
para indicar si el módulo congelado es o no un paquete. Anteriormente, un valor negativo en el camposize
era el indicador. Ahora solo se pueden usar valores no negativos parasize
. (Aportado por Kumar Aditya en bpo-46608.)_PyFrameEvalFunction()
ahora toma_PyInterpreterFrame*
como su segundo parámetro, en lugar dePyFrameObject*
. Consulte PEP 523 para obtener más detalles sobre cómo usar este tipo de puntero de función.PyCode_New()
yPyCode_NewWithPosOnlyArgs()
ahora toman un argumentoexception_table
adicional. Debe evitarse el uso de estas funciones, en la medida de lo posible. Para obtener un objeto de código personalizado: cree un objeto de código usando el compilador, luego obtenga una versión modificada con el métodoreplace
.PyCodeObject
ya no tiene los camposco_code
,co_varnames
,co_cellvars
yco_freevars
. En su lugar, utilicePyCode_GetCode()
,PyCode_GetVarnames()
,PyCode_GetCellvars()
yPyCode_GetFreevars()
respectivamente para acceder a ellos a través de la API de C. (Aportado por Brandt Bucher en bpo-46841 y Ken Jin en gh-92154 y gh-94936).Las antiguas macros de papelera (
Py_TRASHCAN_SAFE_BEGIN
/Py_TRASHCAN_SAFE_END
) ahora están obsoletas. Deberían ser reemplazadas por las nuevas macrosPy_TRASHCAN_BEGIN
yPy_TRASHCAN_END
.Una función tp_dealloc que tiene las macros antiguas, como:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_SAFE_BEGIN(p); ... Py_TRASHCAN_SAFE_END }
debe migrar a las nuevas macros de la siguiente manera:
static void mytype_dealloc(mytype *p) { PyObject_GC_UnTrack(p); Py_TRASHCAN_BEGIN(p, mytype_dealloc) ... Py_TRASHCAN_END }
Tenga en cuenta que
Py_TRASHCAN_BEGIN
tiene un segundo argumento que debería ser la función de desasignación en la que se encuentra.Para admitir versiones anteriores de Python en la misma base de código, puede definir las siguientes macros y usarlas en todo el código (crédito: se copiaron de la base de código
mypy
):#if PY_VERSION_HEX >= 0x03080000 # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_END #else # define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op) # define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op) #endif
The
PyType_Ready()
function now raises an error if a type is defined with thePy_TPFLAGS_HAVE_GC
flag set but has no traverse function (PyTypeObject.tp_traverse
). (Contributed by Victor Stinner in bpo-44263.)Heap types with the
Py_TPFLAGS_IMMUTABLETYPE
flag can now inherit the PEP 590 vectorcall protocol. Previously, this was only possible for static types. (Contributed by Erlend E. Aasland in bpo-43908)Dado que
Py_TYPE()
se cambia a una función estática en línea,Py_TYPE(obj) = new_type
debe reemplazarse porPy_SET_TYPE(obj, new_type)
: consulte la funciónPy_SET_TYPE()
(disponible desde Python 3.9). Para compatibilidad con versiones anteriores, se puede usar esta macro:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE) static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type) { ob->ob_type = type; } #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type) #endif
(Aportado por Victor Stinner en bpo-39573.)
Dado que
Py_SIZE()
se cambia a una función estática en línea,Py_SIZE(obj) = new_size
debe reemplazarse porPy_SET_SIZE(obj, new_size)
: consulte la funciónPy_SET_SIZE()
(disponible desde Python 3.9). Para compatibilidad con versiones anteriores, se puede usar esta macro:#if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE) static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size) { ob->ob_size = size; } #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size) #endif
(Aportado por Victor Stinner en bpo-39573.)
<Python.h>
ya no incluye los archivos de encabezado<stdlib.h>
,<stdio.h>
,<errno.h>
y<string.h>
cuando la macroPy_LIMITED_API
se establece en0x030b0000
(Python 3.11) o superior. Las extensiones de C deben incluir explícitamente los archivos de encabezado después de#include <Python.h>
. (Aportado por Victor Stinner en bpo-45434.)Los archivos de API no limitados
cellobject.h
,classobject.h
,code.h
,context.h
,funcobject.h
,genobject.h
ylongintrepr.h
se han movido al directorioInclude/cpython
. Además, se eliminó el archivo de encabezadoeval.h
. Estos archivos no deben incluirse directamente, ya que ya están incluidos enPython.h
: Include Files. Si se han incluido directamente, considere incluirPython.h
en su lugar. (Aportado por Victor Stinner en bpo-35134.)La macro
PyUnicode_CHECK_INTERNED()
se ha excluido de la API de C limitada. Nunca se pudo usar allí, porque usaba estructuras internas que no están disponibles en la API de C limitada. (Aportado por Victor Stinner en bpo-46007.)Las siguientes funciones y tipos de cuadros ahora están disponibles directamente con
#include <Python.h>
, ya no es necesario agregar#include <frameobject.h>
:(Aportado por Victor Stinner en gh-93937.)
Los miembros de la estructura
PyFrameObject
se han eliminado de la API de C pública.Si bien la documentación señala que los campos
PyFrameObject
están sujetos a cambios en cualquier momento, se han mantenido estables durante mucho tiempo y se usaron en varias extensiones populares.En Python 3.11, la estructura del marco se reorganizó para permitir optimizaciones de rendimiento. Algunos campos se eliminaron por completo, ya que eran detalles de la implementación anterior.
Campos
PyFrameObject
:f_back
: usaPyFrame_GetBack()
.f_blockstack
: eliminado.f_builtins
: usaPyFrame_GetBuiltins()
.f_code
: usaPyFrame_GetCode()
.f_gen
: usaPyFrame_GetGenerator()
.f_globals
: usaPyFrame_GetGlobals()
.f_iblock
: eliminado.f_lasti
: usaPyFrame_GetLasti()
. El código que usaf_lasti
conPyCode_Addr2Line()
debería usarPyFrame_GetLineNumber()
en su lugar; puede ser más rápido.f_lineno
: usarPyFrame_GetLineNumber()
f_locals
: usaPyFrame_GetLocals()
.f_stackdepth
: eliminado.f_state
: sin API pública (renombrado comof_frame.f_state
).f_trace
: sin API pública.f_trace_lines
: utilizaPyObject_GetAttrString((PyObject*)frame, "f_trace_lines")
.f_trace_opcodes
: utilizaPyObject_GetAttrString((PyObject*)frame, "f_trace_opcodes")
.f_localsplus
: sin API pública (renombrado comof_frame.localsplus
).f_valuestack
: eliminado.
The Python frame object is now created lazily. A side effect is that the
f_back
member must not be accessed directly, since its value is now also computed lazily. ThePyFrame_GetBack()
function must be called instead.Debuggers that accessed the
f_locals
directly must callPyFrame_GetLocals()
instead. They no longer need to callPyFrame_FastToLocalsWithError()
orPyFrame_LocalsToFast()
, in fact they should not call those functions. The necessary updating of the frame is now managed by the virtual machine.Código que define
PyFrame_GetCode()
en Python 3.8 y anteriores:#if PY_VERSION_HEX < 0x030900B1 static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame) { Py_INCREF(frame->f_code); return frame->f_code; } #endif
Código que define
PyFrame_GetBack()
en Python 3.8 y anteriores:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame) { Py_XINCREF(frame->f_back); return frame->f_back; } #endif
Or use the pythoncapi_compat project to get these two functions on older Python versions.
Cambios de los miembros de la estructura
PyThreadState
:frame
: eliminado, usePyThreadState_GetFrame()
(función agregada a Python 3.9 por bpo-40429). Advertencia: la función devuelve un strong reference, necesita llamar aPy_XDECREF()
.tracing
: cambiado, usePyThreadState_EnterTracing()
yPyThreadState_LeaveTracing()
(funciones agregadas a Python 3.11 por bpo-43760).recursion_depth
: eliminado, use(tstate->recursion_limit - tstate->recursion_remaining)
en su lugar.stackcheck_counter
: eliminado.
Código que define
PyThreadState_GetFrame()
en Python 3.8 y anteriores:#if PY_VERSION_HEX < 0x030900B1 static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate) { Py_XINCREF(tstate->frame); return tstate->frame; } #endif
Código que define
PyThreadState_EnterTracing()
yPyThreadState_LeaveTracing()
en Python 3.10 y versiones anteriores:#if PY_VERSION_HEX < 0x030B00A2 static inline void PyThreadState_EnterTracing(PyThreadState *tstate) { tstate->tracing++; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = 0; #else tstate->use_tracing = 0; #endif } static inline void PyThreadState_LeaveTracing(PyThreadState *tstate) { int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL); tstate->tracing--; #if PY_VERSION_HEX >= 0x030A00A1 tstate->cframe->use_tracing = use_tracing; #else tstate->use_tracing = use_tracing; #endif } #endif
Or use the pythoncapi-compat project to get these functions on old Python functions.
Se alienta a los distribuidores a compilar Python con la biblioteca Blake2 optimizada libb2.
El campo
PyConfig.module_search_paths_set
ahora debe establecerse en 1 para que la inicialización usePyConfig.module_search_paths
para inicializarsys.path
. De lo contrario, la inicialización volverá a calcular la ruta y reemplazará los valores agregados amodule_search_paths
.PyConfig_Read()
ya no calcula la ruta de búsqueda inicial y no completará ningún valor enPyConfig.module_search_paths
. Para calcular rutas predeterminadas y luego modificarlas, finalice la inicialización y usePySys_GetObject()
para recuperarsys.path
como un objeto de lista de Python y modificarlo directamente.
Obsoleto¶
Deseche las siguientes funciones para configurar la inicialización de Python:
PySys_AddWarnOptionUnicode()
PySys_AddWarnOption()
PySys_AddXOption()
PySys_HasWarnOptions()
PySys_SetArgvEx()
PySys_SetArgv()
PySys_SetPath()
Py_SetPath()
Py_SetProgramName()
Py_SetPythonHome()
Py_SetStandardStreamEncoding()
_Py_SetProgramFullPath()
Utilice la nueva API
PyConfig
de Python Initialization Configuration en su lugar (PEP 587). (Aportado por Victor Stinner en gh-88279.)Deje obsoleto el miembro
ob_shash
dePyBytesObject
. UtilicePyObject_Hash()
en su lugar. (Aportado por Inada Naoki en bpo-46864.)
Eliminación pendiente en Python 3.12¶
Las siguientes API de C quedaron obsoletas en versiones anteriores de Python y se eliminarán en Python 3.12.
PyUnicode_AS_DATA()
PyUnicode_AS_UNICODE()
PyUnicode_AsUnicodeAndSize()
PyUnicode_AsUnicode()
PyUnicode_FromUnicode()
PyUnicode_GET_DATA_SIZE()
PyUnicode_GET_SIZE()
PyUnicode_GetSize()
PyUnicode_IS_COMPACT()
PyUnicode_IS_READY()
PyUnicode_WSTR_LENGTH()
_PyUnicode_AsUnicode()
PyUnicode_WCHAR_KIND
PyUnicode_InternImmortal()
Remoto¶
PyFrame_BlockSetup()
andPyFrame_BlockPop()
have been removed. (Contributed by Mark Shannon in bpo-40222.)Quite las siguientes macros matemáticas usando la variable
errno
:Py_ADJUST_ERANGE1()
Py_ADJUST_ERANGE2()
Py_OVERFLOWED()
Py_SET_ERANGE_IF_OVERFLOW()
Py_SET_ERRNO_ON_MATH_ERROR()
(Aportado por Victor Stinner en bpo-45412.)
Elimine las macros
Py_UNICODE_COPY()
yPy_UNICODE_FILL()
, obsoletas desde Python 3.3. UtilicePyUnicode_CopyCharacters()
omemcpy()
(cadenawchar_t*
) y las funcionesPyUnicode_Fill()
en su lugar. (Aportado por Victor Stinner en bpo-41123.)Elimine el archivo de encabezado
pystrhex.h
. Solo contiene funciones privadas. Las extensiones C solo deben incluir el archivo de encabezado principal<Python.h>
. (Aportado por Victor Stinner en bpo-45434.)Quite la macro
Py_FORCE_DOUBLE()
. Fue utilizado por la macroPy_IS_INFINITY()
. (Aportado por Victor Stinner en bpo-45440.)Los siguientes elementos ya no están disponibles cuando se define
Py_LIMITED_API
:la macro
Py_MARSHAL_VERSION
These are not part of the limited API.
(Aportado por Victor Stinner en bpo-45474.)
Exclude
PyWeakref_GET_OBJECT()
from the limited C API. It never worked since thePyWeakReference
structure is opaque in the limited C API. (Contributed by Victor Stinner in bpo-35134.)Quite la macro
PyHeapType_GET_MEMBERS()
. Fue expuesto en la API pública de C por error, solo debe ser utilizado por Python internamente. Utilice el miembroPyTypeObject.tp_members
en su lugar. (Aportado por Victor Stinner en bpo-40170.)Elimine la macro
HAVE_PY_SET_53BIT_PRECISION
(movida a la API de C interna). (Aportado por Victor Stinner en bpo-45412.)
Elimine las API del codificador
Py_UNICODE
, ya que han quedado obsoletas desde Python 3.3, se usan poco y son ineficientes en relación con las alternativas recomendadas.Las funciones eliminadas son:
PyUnicode_Encode()
PyUnicode_EncodeASCII()
PyUnicode_EncodeLatin1()
PyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUTF32()
PyUnicode_EncodeUnicodeEscape()
PyUnicode_EncodeRawUnicodeEscape()
PyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeDecimal()
PyUnicode_TransformDecimalToASCII()
Ver PEP 624 para más detalles y migration guidance. (Aportado por Inada Naoki en bpo-44029.)
Notable Changes in 3.11.4¶
tarfile¶
The extraction methods in
tarfile
, andshutil.unpack_archive()
, have a new a filter argument that allows limiting tar features than may be surprising or dangerous, such as creating files outside the destination directory. See Extraction filters for details. In Python 3.12, use without the filter argument will show aDeprecationWarning
. In Python 3.14, the default will switch to'data'
. (Contributed by Petr Viktorin in PEP 706.)
Notable Changes in 3.11.5¶
OpenSSL¶
Windows builds and macOS installers from python.org now use OpenSSL 3.0.
Notable changes in 3.11.10¶
ipaddress¶
Fixed
is_global
andis_private
behavior inIPv4Address
,IPv6Address
,IPv4Network
andIPv6Network
.
email¶
Headers with embedded newlines are now quoted on output.
The
generator
will now refuse to serialize (write) headers that are improperly folded or delimited, such that they would be parsed as multiple headers or joined with adjacent data. If you need to turn this safety feature off, setverify_generated_headers
. (Contributed by Bas Bloemsaat and Petr Viktorin in gh-121650.)email.utils.getaddresses()
andemail.utils.parseaddr()
now return('', '')
2-tuples in more situations where invalid email addresses are encountered, instead of potentially inaccurate values. An optional strict parameter was added to these two functions: usestrict=False
to get the old behavior, accepting malformed inputs.getattr(email.utils, 'supports_strict_parsing', False)
can be used to check if the strict paramater is available. (Contributed by Thomas Dwyer and Victor Stinner for gh-102988 to improve the CVE-2023-27043 fix.)