Qué hay de nuevo en Python 3.9¶
- Editor:
Łukasz Langa
This article explains the new features in Python 3.9, compared to 3.8. Python 3.9 was released on October 5, 2020. For full details, see the changelog.
Ver también
PEP 596 - Programa de lanzamiento de Python 3.9
Resumen: aspectos destacados de la versión¶
Nuevas funciones de sintaxis:
PEP 584, operadores unión agregados a
dict
;PEP 585, genéricos de sugerencia de tipo en colecciones estándar;
PEP 614, restricciones gramaticales relajadas para los decoradores.
Nuevas funciones integradas:
PEP 616, métodos de cadena para eliminar prefijos y sufijos.
Nuevas funciones en la biblioteca estándar:
PEP 593, función flexible y anotaciones variables;
Se agregó
os.pidfd_open()
que permite la gestión de procesos sin razas ni señales.
Mejoras en el intérprete:
PEP 573, acceso rápido al estado del módulo desde métodos de tipos de extensión C;
PEP 617, CPython ahora usa un nuevo analizador basado en PEG;
varias incorporaciones de Python (rango, tupla, conjunto, conjunto frozenset, lista, dict) ahora se aceleran usando PEP 590 vectorcall;
la recolección de basura no bloquea los objetos resucitados;
a number of Python modules (
_abc
,audioop
,_bz2
,_codecs
,_contextvars
,_crypt
,_functools
,_json
,_locale
,math
,operator
,resource
,time
,_weakref
) now use multiphase initialization as defined by PEP 489;a number of standard library modules (
audioop
,ast
,grp
,_hashlib
,pwd
,_posixsubprocess
,random
,select
,struct
,termios
,zlib
) are now using the stable ABI defined by PEP 384.
Nuevos módulos de biblioteca:
PEP 615, la base de datos de zona horaria de IANA ahora está presente en la biblioteca estándar en el módulo
zoneinfo
;ahora se proporciona una implementación de una especie de gráfico topológico en el nuevo módulo
graphlib
.
Cambios en el proceso de lanzamiento:
PEP 602, CPython adopta un ciclo de lanzamiento anual.
Debe verificar DeprecationWarning en su código¶
Cuando todavía se admitía Python 2.7, se conservaba una gran cantidad de funciones en Python 3 por compatibilidad con versiones anteriores de Python 2.7. Con el fin de la compatibilidad con Python 2, estas capas de compatibilidad con versiones anteriores se eliminaron o se eliminarán pronto. La mayoría de ellos emitió una advertencia DeprecationWarning
durante varios años. Por ejemplo, usar collections.Mapping
en lugar de collections.abc.Mapping
emite un DeprecationWarning
desde Python 3.3, lanzado en 2012.
Pruebe su aplicación con la opción de línea de comandos -W
default
para ver DeprecationWarning
y PendingDeprecationWarning
, o incluso con -W
error
para tratarlos como errores. Warnings Filter se puede utilizar para ignorar las advertencias del código de terceros.
Python 3.9 es la última versión que proporciona esas capas de compatibilidad con versiones anteriores de Python 2, para dar más tiempo a los mantenedores de proyectos de Python para organizar la eliminación del soporte de Python 2 y agregar soporte para Python 3.9.
Los alias de Abstract Base Classes en el módulo collections
, como el alias de collections.Mapping
de collections.abc.Mapping
, se mantienen para una última versión por compatibilidad con versiones anteriores. Se eliminarán de Python 3.10.
De manera más general, intente ejecutar sus pruebas en el Python Development Mode, lo que ayuda a preparar su código para que sea compatible con la próxima versión de Python.
Nota: también se eliminaron varias obsoletas en esta versión de Python. Consulte la sección Remoto.
Nuevas características¶
Operadores de combinación y actualización de diccionarios¶
Los operadores de fusión (|
) y actualización (|=
) se han agregado a la clase dict
incorporada. Estos complementan los métodos dict.update
y {**d1, **d2}
existentes para fusionar diccionarios.
Ejemplo:
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}
Consulte PEP 584 para obtener una descripción completa. (Contribuido por Brandt Bucher en bpo-36144.)
Nuevos métodos de cadena para eliminar prefijos y sufijos¶
Se han agregado str.removeprefix(prefix)
y str.removesuffix(suffix)
para eliminar fácilmente un prefijo o sufijo innecesario de una cadena. También se han agregado los métodos correspondientes bytes
, bytearray
y collections.UserString
. Consulte PEP 616 para obtener una descripción completa. (Contribuido por Dennis Sweeney en bpo-39939.)
Tipos genéricos de sugerencia en colecciones estándar¶
En las anotaciones de tipo, ahora puede usar tipos de colección integrados como list
y dict
como tipos genéricos en lugar de importar los tipos en mayúsculas correspondientes (por ejemplo, List
o Dict
) desde typing
. Algunos otros tipos de la biblioteca estándar ahora también son genéricos, por ejemplo, queue.Queue
.
Ejemplo:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
Consulte PEP 585 para obtener más detalles. (Contribuido por Guido van Rossum, Ethan Smith y Batuhan Taşkaya en bpo-39481.)
Nuevo analizador¶
Python 3.9 usa un nuevo analizador, basado en PEG en lugar de LL(1). El rendimiento del analizador nuevo es aproximadamente comparable al del analizador anterior, pero el formalismo PEG es más flexible que LL (1) cuando se trata de diseñar nuevas funciones de lenguaje. Comenzaremos a usar esta flexibilidad en Python 3.10 y versiones posteriores.
El módulo ast
usa el nuevo analizador y produce el mismo AST que el analizador anterior.
In Python 3.10, the old parser will be deleted and so will all
functionality that depends on it (primarily the parser
module,
which has long been deprecated). In Python 3.9 only, you can switch
back to the LL(1) parser using a command line switch (-X
oldparser
) or an environment variable (PYTHONOLDPARSER=1
).
Consulte PEP 617 para obtener más detalles. (Contribuido por Guido van Rossum, Pablo Galindo y Lysandros Nikolaou en bpo-40334.)
Otros cambios de idioma¶
__import__()
ahora lanzaImportError
en lugar deValueError
, que solía ocurrir cuando una importación relativa pasaba de su paquete de nivel superior. (Contribuido por Ngalim Siregar en bpo-37444.)Python ahora obtiene la ruta absoluta del nombre de archivo del script especificado en la línea de comando (por ejemplo:
python3 script.py
): el módulo__file__
attribute of the__main__
se convirtió en una ruta absoluta, en lugar de una ruta relativa. Estas rutas ahora siguen siendo válidas después de que las tramas del móduloos.chdir()
. Como efecto alterno, la traza también muestra la ruta absoluta para los marcos del módulo__main__
en este caso. (Contribuido por Victor Stinner en bpo-20443.)En Python Development Mode y en debug build, los argumentos de encoding and errors ahora se comprueban para las operaciones de codificación y decodificación de cadenas. Ejemplos:
open()
,str.encode()
ybytes.decode()
.De forma predeterminada, para un mejor rendimiento, el argumento errors argument is only checked at the first encoding/decoding error and the encoding a veces se ignora para cadenas vacías. (Contribuido por Victor Stinner en bpo-37388.)
"".replace("", s, n)
ahora devuelves
en lugar de una cadena vacía para todos losn
distintos de cero. Ahora es compatible con"".replace("", s)
. Hay cambios similares para los objetosbytes
ybytearray
. (Contribuido por Serhiy Storchaka en bpo-28029.)Cualquier expresión válida ahora se puede utilizar como decorator. Anteriormente, la gramática era mucho más restrictiva. Consulte PEP 614 para obtener más detalles. (Contribuido por Brandt Bucher en bpo-39702.)
Ayuda mejorada para el módulo
typing
. Las cadenas de documentos ahora se muestran para todas las formas especiales y alias genéricos especiales (comoUnion
yList
). El uso dehelp()
con un alias genérico comoList[int]
mostrará la ayuda para el tipo concreto correspondiente (list
en este caso). (Contribuido por Serhiy Storchaka en bpo-40257.)La ejecución en paralelo de
aclose()
/asend()
/athrow()
ahora está prohibida, yag_running
ahora refleja el estado de ejecución real del generador asíncrono. (Contribuido por Yury Selivanov en bpo-30773.)Los errores inesperados al llamar al método
__iter__
ya no están enmascarados porTypeError
en el operadorin
y funcionescontains()
,indexOf()
ycountOf()
del módulooperator
. (Contribuido por Serhiy Storchaka en bpo-40824.)Las expresiones lambda sin paréntesis ya no pueden ser la parte de expresión en una cláusula
if
en comprensiones y expresiones generadoras. Consulte bpo-41848 y bpo-43755 para obtener más detalles.
Nuevos módulos¶
zoneinfo¶
El módulo zoneinfo
brinda soporte para la base de datos de zona horaria de IANA a la biblioteca estándar. Agrega zoneinfo.ZoneInfo
, una implementación de datetime.tzinfo
concreta respaldada por los datos de la zona horaria del sistema.
Ejemplo:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
As a fall-back source of data for platforms that don’t ship the IANA database, the tzdata module was released as a first-party package – distributed via PyPI and maintained by the CPython core team.
Ver también
- PEP 615: compatibilidad con la base de datos de zona horaria de IANA en la biblioteca estándar
PEP escrito e implementado por Paul Ganssle
Graphlib¶
Se agregó un nuevo módulo, graphlib
, que contiene la clase graphlib.TopologicalSorter
para ofrecer funcionalidad para realizar la clasificación topológica de gráficos. (Contribuido por Pablo Galindo, Tim Peters y Larry Hastings en bpo-17005.)
Módulos mejorados¶
ast¶
Se agregó la opción indent a dump()
que le permite producir una salida con sangría de varias líneas. (Contribuido por Serhiy Storchaka en bpo-37995.)
Se agregó ast.unparse()
como una función en el módulo ast
que se puede usar para descomprimir un objeto ast.AST
y producir una cadena con código que produciría un objeto ast.AST
equivalente cuando se analiza. (Contribuido por Pablo Galindo y Batuhan Taskaya en bpo-38870.)
Se agregaron cadenas de documentación a los nodos AST que contienen la firma ASDL utilizada para construir ese nodo. (Contribuido por Batuhan Taskaya en bpo-39638.)
asyncio¶
Debido a importantes problemas de seguridad, el parámetro reuse_address de asyncio.loop.create_datagram_endpoint()
ya no es compatible. Esto se debe al comportamiento de la opción de socket SO_REUSEADDR
en UDP. Para obtener más detalles, consulte la documentación de loop.create_datagram_endpoint()
. (Contribuido por Kyle Stanley, Antoine Pitrou y Yury Selivanov en bpo-37228.)
Se agregó un nuevo coroutine shutdown_default_executor()
que programa un apagado para el ejecutor predeterminado que espera en el ThreadPoolExecutor
para finalizar el cierre. Además, asyncio.run()
se ha actualizado para utilizar el nuevo coroutine. (Contribuido por Kyle Stanley en bpo-34037.)
Se agregó asyncio.PidfdChildWatcher
, una implementación de observador de niños específica de Linux que sondea los descriptores de archivos de proceso. (bpo-38692)
Se agregó un nuevo coroutine asyncio.to_thread()
. Se utiliza principalmente para ejecutar funciones vinculadas a IO en un hilo separado para evitar bloquear el bucle de eventos, y esencialmente funciona como una versión de alto nivel de run_in_executor()
que puede tomar directamente argumentos de palabras clave. (Contribuido por Kyle Stanley y Yury Selivanov en bpo-32309.)
Al cancelar la tarea debido a un tiempo de espera, asyncio.wait_for()
ahora esperará hasta que se complete la cancelación también en el caso de que timeout sea <= 0, como ocurre con los tiempos de espera positivos. (Contribuido por Elvis Pranskevichus en bpo-32751.)
asyncio
now raises TypeError
when calling incompatible
methods with an ssl.SSLSocket
socket.
(Contributed by Ido Michael in bpo-37404.)
compilar todo¶
Se agregó una nueva posibilidad de usar enlaces duros para archivos .pyc
duplicados: parámetro hardlink_dupes y opción de línea de comando –hardlink-dupes. (Contribuido por Lumír “Frenzy” Balhar en bpo-40495.)
Se agregaron nuevas opciones para la manipulación de rutas en los archivos .pyc
resultantes: parámetros stripdir, prependdir, limit_sl_dest y opciones de línea de comando -s, -p, -e. Se agregó la posibilidad de especificar la opción para un nivel de optimización varias veces. (Contribuido por Lumír “Frenzy” Balhar en bpo-38112.)
Futuros concurrentes¶
Se agregó un nuevo parámetro cancel_futures a concurrent.futures.Executor.shutdown()
que cancela todos los futuros pendientes que no han comenzado a ejecutarse, en lugar de esperar a que se completen antes de apagar el ejecutor. (Contribuido por Kyle Stanley en bpo-39349.)
Se eliminaron los subprocesos del demonio de ThreadPoolExecutor
y ProcessPoolExecutor
. Esto mejora la compatibilidad con los subinterpretadores y la previsibilidad en sus procesos de cierre. (Contribuido por Kyle Stanley en bpo-39812.)
Los trabajadores en ProcessPoolExecutor
ahora se generan a pedido, solo cuando no hay trabajadores inactivos disponibles para reutilizar. Esto optimiza la sobrecarga de inicio y reduce la cantidad de tiempo de CPU perdido para los trabajadores inactivos. (Contribuido por Kyle Stanley en bpo-39207.)
maldiciones¶
Se agregaron funciones curses.get_escdelay()
, curses.set_escdelay()
, curses.get_tabsize()
y curses.set_tabsize()
. (Contribuido por Anthony Sottile en bpo-38312.)
fecha y hora¶
The isocalendar()
of datetime.date
and isocalendar()
of datetime.datetime
methods now returns a namedtuple()
instead of a tuple
.
(Contributed by Donghee Na in bpo-24416.)
distutils¶
El comando: command: upload ahora crea resúmenes de hash SHA2-256 y Blake2b-256. Omite MD5 en plataformas que bloquean el resumen de MD5. (Contribuido por Christian Heimes en bpo-40698.)
fcntl¶
Added constants F_OFD_GETLK
, F_OFD_SETLK
and F_OFD_SETLKW
.
(Contributed by Donghee Na in bpo-38602.)
ftplib¶
FTP
and FTP_TLS
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
GC¶
Cuando el recolector de basura realiza una recolección en la que resucitan algunos objetos (se puede acceder a ellos desde fuera de los ciclos aislados después de que se hayan ejecutado los finalizadores), no bloquee la recolección de todos los objetos que aún no se pueden alcanzar. (Contribuido por Pablo Galindo y Tim Peters en bpo-38379.)
Se agregó una nueva función gc.is_finalized()
para verificar si el recolector de basura ha finalizado un objeto. (Contribuido por Pablo Galindo en bpo-39322.)
hashlib¶
El módulo hashlib
ahora puede usar hashes SHA3 y SHAKE XOF de OpenSSL cuando esté disponible. (Contribuido por Christian Heimes en bpo-37630.)
Los módulos hash incorporados ahora pueden desactivarse con ./configure --without-builtin-hashlib-hashes
o activarse selectivamente con p. Ej. ./configure --with-builtin-hashlib-hashes=sha3,blake2
para forzar el uso de la implementación basada en OpenSSL. (Contribuido por Christian Heimes en bpo-40479)
http¶
HTTP status codes 103 EARLY_HINTS
, 418 IM_A_TEAPOT
and 425 TOO_EARLY
are added to
http.HTTPStatus
. (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)
IDLE e idlelib¶
Opción agregada para apagar el cursor parpadeando. (Contribuido por Zackery Spytz en bpo-4603.)
La tecla Escape ahora cierra las ventanas de finalización IDLE. (Contribuido por Johnny Najera en bpo-38944.)
Se agregaron palabras clave a la lista de finalización del nombre del módulo. (Contribuido por Terry J. Reedy en bpo-37765.)
Novedades de la versión de mantenimiento 3.9
Hacer que IDLE invoque sys.excepthook()
(cuando se inicia sin “-n”). Anteriormente se ignoraban los hooks de usuario. (Contribuido por Ken Hilton en bpo-43008.)
Los cambios anteriores se han actualizado a las versiones de mantenimiento 3.8.
Reorganizar el diálogo de configuración. Dividir la pestaña General en Windows y Shell/Ed. Mover las fuentes de ayuda, que amplían el menú Ayuda, a la pestaña Extensiones. Hacer espacio para nuevas opciones y acortar el diálogo. Esto último hace que el diálogo se adapte mejor a las pantallas pequeñas. (Contribuido por Terry Jan Reedy en bpo-40468.) Mover la configuración del espacio de sangría de la pestaña Fuente a la nueva pestaña Windows. (Contribuido por Mark Roseman y Terry Jan Reedy en bpo-33962.)
Aplicar el resaltado de sintaxis a los archivos .pyi
. (Contribución de Alex Waygood y Terry Jan Reedy en bpo-45447)
imaplib¶
IMAP4
and IMAP4_SSL
now have
an optional timeout parameter for their constructors.
Also, the open()
method now has an optional timeout parameter
with this change. The overridden methods of IMAP4_SSL
and
IMAP4_stream
were applied to this change.
(Contributed by Donghee Na in bpo-38615.)
imaplib.IMAP4.unselect()
is added.
imaplib.IMAP4.unselect()
frees server’s resources associated with the
selected mailbox and returns the server to the authenticated
state. This command performs the same actions as imaplib.IMAP4.close()
, except
that no messages are permanently removed from the currently
selected mailbox. (Contributed by Donghee Na in bpo-40375.)
importlib¶
Para mejorar la coherencia con las declaraciones de importación, importlib.util.resolve_name()
ahora lanza ImportError
en lugar de ValueError
para intentos de importación relativa no válidos. (Contribuido por Ngalim Siregar en bpo-37444.)
Los cargadores de importación que publican objetos de módulo inmutables ahora pueden publicar paquetes inmutables además de módulos individuales. (Contribuido por Dino Viehland en bpo-39336.)
Se agregó la función importlib.resources.files()
con soporte para subdirectorios en los datos del paquete, compatible con el backport en importlib_resources
versión 1.5. (Contribuido por Jason R. Coombs en bpo-39791.)
importlib.metadata
actualizado de importlib_metadata
versión 1.6.1.
inspeccionar¶
inspect.BoundArguments.arguments
se cambia de OrderedDict
a dictado regular. (Contribuido por Inada Naoki en bpo-36350 y bpo-39775.)
dirección IP¶
ipaddress
ahora admite direcciones de ámbito IPv6 (dirección IPv6 con sufijo %<scope_id>
).
Las direcciones IPv6 con alcance se pueden analizar mediante ipaddress.IPv6Address
. Si está presente, la identificación de la zona del alcance está disponible a través del atributo scope_id
. (Contribuido por Oleksandr Pavliuk en bpo-34788.)
A partir de Python 3.9.5, el módulo ipaddress
ya no acepta ceros a la izquierda en cadenas de direcciones IPv4. (Contribuido por Christian Heimes en bpo-36384).
Matemáticas¶
Se amplió la función math.gcd()
para manejar múltiples argumentos. Anteriormente, solo respaldaba dos argumentos. (Contribuido por Serhiy Storchaka en bpo-39648.)
math.lcm()
agregado: devuelve el mínimo común múltiplo de argumentos especificados. (Contribuido por Mark Dickinson, Ananthakrishnan y Serhiy Storchaka en bpo-39479 y bpo-39648.)
math.nextafter()
agregado: devuelve el siguiente valor de punto flotante después de x towards y. (Contribuido por Victor Stinner en bpo-39288.)
math.ulp()
agregado: devuelve el valor del bit menos significativo de un flotador. (Contribuido por Victor Stinner en bpo-39310.)
multiprocesamiento¶
La clase multiprocessing.SimpleQueue
tiene un nuevo método close()
para cerrar explícitamente la cola. (Contribuido por Victor Stinner en bpo-30966.)
nntplib¶
NNTP
and NNTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
os¶
Added CLD_KILLED
and CLD_STOPPED
for si_code
.
(Contributed by Donghee Na in bpo-38493.)
Exposed the Linux-specific os.pidfd_open()
(bpo-38692) and
os.P_PIDFD
(bpo-38713) for process management with file
descriptors.
La función os.unsetenv()
ahora también está disponible en Windows. (Contribuido por Victor Stinner en bpo-39413.)
Las funciones os.putenv()
y os.unsetenv()
ahora están siempre disponibles. (Contribuido por Victor Stinner en bpo-39395.)
Función os.waitstatus_to_exitcode()
agregada: convierte un estado de espera en un código de salida. (Contribuido por Victor Stinner en bpo-40094.)
Pathlib¶
Added pathlib.Path.readlink()
which acts similarly to
os.readlink()
.
(Contributed by Girts Folkmanis in bpo-30618)
pdb¶
En Windows, ahora Pdb
es compatible con ~/.pdbrc
. (Contribuido por Tim Hopper y Dan Lidral-Porter en bpo-20523.)
poplib¶
POP3
and POP3_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
pprint¶
pprint
ahora puede imprimir types.SimpleNamespace
de forma bonita. (Contribuido por Carl Bordum Hansen en bpo-37376.)
Pydoc¶
The documentation string is now shown not only for class, function,
method etc, but for any object that has its own __doc__
attribute.
(Contributed by Serhiy Storchaka in bpo-40257.)
aleatorio¶
Se agregó un nuevo método random.Random.randbytes
: generar bytes aleatorios. (Contribuido por Victor Stinner en bpo-40286.)
señal¶
Expuso el signal.pidfd_send_signal()
específico de Linux para enviar señales a un proceso utilizando un descriptor de archivo en lugar de un pid. (bpo-38712)
smtplib¶
SMTP
and SMTP_SSL
now raise a ValueError
if the given timeout for their constructor is zero to prevent the creation of
a non-blocking socket. (Contributed by Donghee Na in bpo-39259.)
LMTP
constructor now has an optional timeout parameter.
(Contributed by Donghee Na in bpo-39329.)
enchufe¶
The socket
module now exports the CAN_RAW_JOIN_FILTERS
constant on Linux 4.1 and greater.
(Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)
The socket module now supports the CAN_J1939
protocol on
platforms that support it. (Contributed by Karl Ding in bpo-40291.)
El módulo de enchufe ahora tiene las funciones socket.send_fds()
y socket.recv_fds()
. (Contribuido por Joannah Nanjekye, Shinya Okano y Victor Stinner en bpo-28724.)
tiempo¶
En AIX, thread_time()
ahora se implementa con thread_cputime()
que tiene una resolución de nanosegundos, en lugar de clock_gettime(CLOCK_THREAD_CPUTIME_ID)
que tiene una resolución de 10 ms. (Contribuido por Batuhan Taskaya en bpo-40192)
sys¶
Added a new sys.platlibdir
attribute: name of the platform-specific
library directory. It is used to build the path of standard library and the
paths of installed extension modules. It is equal to "lib"
on most
platforms. On Fedora and SuSE, it is equal to "lib64"
on 64-bit platforms.
(Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)
Previously, sys.stderr
was block-buffered when non-interactive. Now
stderr
defaults to always being line-buffered.
(Contributed by Jendrik Seipp in bpo-13601.)
tracemalloc¶
Se agregó tracemalloc.reset_peak()
para establecer el tamaño máximo de los bloques de memoria rastreados al tamaño actual, para medir el pico de piezas de código específicas. (Contribuido por Huon Wilson en bpo-40630.)
mecanografía¶
PEP 593 introdujo un tipo typing.Annotated
para decorar tipos existentes con metadatos específicos del contexto y el nuevo parámetro include_extras
en typing.get_type_hints()
para acceder a los metadatos en tiempo de ejecución. (Contribuido por Till Varoquaux y Konstantin Kashin.)
unicodedata¶
La base de datos Unicode se ha actualizado a la versión 13.0.0. (bpo-39926).
venv¶
Los scripts de activación proporcionados por venv
ahora especifican su personalización de solicitud de manera consistente utilizando siempre el valor especificado por __VENV_PROMPT__
. Anteriormente, algunos scripts usaban __VENV_PROMPT__
incondicionalmente, otros solo si estaba configurado (que era el caso predeterminado) y uno usaba __VENV_NAME__
en su lugar. (Contribuido por Brett Cannon en bpo-37663.)
xml¶
Los caracteres de espacio en blanco dentro de los atributos ahora se conservan al serializar xml.etree.ElementTree
en un archivo XML. Los EOLN ya no se normalizan a «n». Este es el resultado de la discusión sobre cómo interpretar la sección 2.11 de la especificación XML. (Contribuido por Mefistotelis en bpo-39011.)
Optimizaciones¶
Optimización del idioma para la asignación de una variable temporal en las comprensiones. Ahora
for y in [expr]
en comprensiones es tan rápido como una simple asignacióny = expr
. Por ejemplo:sumas = [s para s en [0] para x en datos para s en [s + x]]
A diferencia del operador
:=
, este idioma no filtra una variable al alcance externo.(Contribuido por Serhiy Storchaka en bpo-32856.)
Manejo de señal optimizado en aplicaciones multiproceso. Si un subproceso diferente al subproceso principal recibe una señal, el bucle de evaluación del código de bytes ya no se interrumpe en cada instrucción de código de bytes para verificar si hay señales pendientes que no se pueden manejar. Solo el hilo principal del intérprete principal puede manejar señales.
Anteriormente, el ciclo de evaluación del código de bytes se interrumpía en cada instrucción hasta que el hilo principal manejaba las señales. (Contribuido por Victor Stinner en bpo-40010.)
Optimicé el módulo
subprocess
en FreeBSD usandoclosefrom()
. (Contribuido por Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak y Victor Stinner en bpo-38061.)PyLong_FromDouble()
ahora es hasta 1,87 veces más rápido para valores que se ajustan a long. (Contribuido por Sergey Fedoseev en bpo-37986.)A number of Python builtins (
range
,tuple
,set
,frozenset
,list
,dict
) are now sped up by using PEP 590 vectorcall protocol. (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)difference_update()
optimizado para el caso en el que el otro conjunto es mucho más grande que el conjunto base. (Sugerido por Evgeny Kapun con código aportado por Michele Orrù en bpo-8425.)El asignador de objetos pequeños de Python (
obmalloc.c
) ahora permite (no más de) que una arena vacía permanezca disponible para su reutilización inmediata, sin devolverla al sistema operativo. Esto evita la paliza en bucles simples donde una arena podría crearse y destruirse de nuevo en cada iteración. (Contribuido por Tim Peters en bpo-37257.)floor division de operación flotante ahora tiene un mejor rendimiento. También se actualiza el mensaje de
ZeroDivisionError
para esta operación. (Contribuido por Donghee Na en bpo-39434.)La decodificación de cadenas cortas ASCII con códecs UTF-8 y ascii ahora es aproximadamente un 15% más rápida. (Contribuido por Inada Naoki en bpo-37348.)
A continuación, se muestra un resumen de las mejoras de rendimiento desde Python 3.4 hasta Python 3.9:
Python version 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Variable and attribute read access:
read_local 7.1 7.1 5.4 5.1 3.9 3.9
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.5
read_global 15.5 19.0 14.3 13.6 7.6 7.8
read_builtin 21.1 21.6 18.5 19.0 7.5 7.8
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 17.9
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 16.9
read_instancevar 32.4 33.1 28.0 26.3 25.4 25.3
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 20.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 18.7
read_boundmethod 37.6 37.9 29.6 26.9 27.7 41.1
Variable and attribute write access:
write_local 8.7 9.3 5.5 5.3 4.3 4.3
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.8
write_global 19.7 21.2 18.0 18.0 15.8 16.7
write_classvar 92.9 96.0 104.6 102.1 39.2 39.8
write_instancevar 44.6 45.8 40.0 38.9 35.5 37.4
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 25.8
Data structure read access:
read_list 24.2 24.5 20.8 20.8 19.0 19.5
read_deque 24.7 25.5 20.2 20.6 19.8 20.2
read_dict 24.3 25.7 22.3 23.0 21.0 22.4
read_strdict 22.6 24.3 19.5 21.2 18.9 21.5
Data structure write access:
write_list 27.1 28.5 22.5 21.6 20.0 20.0
write_deque 28.7 30.1 22.7 21.8 23.5 21.7
write_dict 31.4 33.3 29.3 29.2 24.7 25.4
write_strdict 28.4 29.9 27.5 25.2 23.1 24.5
Stack (or queue) operations:
list_append_pop 93.4 112.7 75.4 74.2 50.8 50.6
deque_append_pop 43.5 57.0 49.4 49.2 42.5 44.2
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 46.4
Timing loop:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3
These results were generated from the variable access benchmark script at:
Tools/scripts/var_access_benchmark.py
. The benchmark script displays timings
in nanoseconds. The benchmarks were measured on an
Intel® Core™ i7-4960HQ processor
running the macOS 64-bit builds found at
python.org.
Obsoleto¶
El comando distutils
bdist_msi
ahora está en desuso, usebdist_wheel
(paquetes de ruedas) en su lugar. (Contribuido por Hugo van Kemenade en bpo-39586.)Actualmente,
math.factorial()
acepta instancias defloat
con valores enteros no negativos (como5.0
). Sube unValueError
para flotadores no integrales y negativos. Ahora está en desuso. En futuras versiones de Python, lanzará unTypeError
para todos los flotadores. (Contribuido por Serhiy Storchaka en bpo-37315.)The
parser
andsymbol
modules are deprecated and will be removed in future versions of Python. For the majority of use cases, users can leverage the Abstract Syntax Tree (AST) generation and compilation stage, using theast
module.The Public C API functions
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
andPyNode_Compile()
are deprecated and will be removed in Python 3.10 together with the old parser.El uso de
NotImplemented
en un contexto booleano ha quedado obsoleto, ya que es casi exclusivamente el resultado de implementaciones incorrectas de comparadores ricos. Se convertirá enTypeError
en una versión futura de Python. (Contribuido por Josh Rosenberg en bpo-35712.)El módulo
random
actualmente acepta cualquier tipo hash como posible valor semilla. Desafortunadamente, no se garantiza que algunos de esos tipos tengan un valor hash determinista. Después de Python 3.9, el módulo restringirá sus semillas aNone
,int
,float
,str
,bytes
ybytearray
.Abrir el archivo
GzipFile
para escritura sin especificar el argumento mode argument is deprecated. In future Python versions it will always be opened for reading by default. Specify the mode para abrirlo para escribir y silenciar una advertencia. (Contribuido por Serhiy Storchaka en bpo-28286.)Deprecated the
split()
method of_tkinter.TkappType
in favour of thesplitlist()
method which has more consistent and predictable behavior. (Contributed by Serhiy Storchaka in bpo-38371.)El paso explícito de objetos de rutina a
asyncio.wait()
ha quedado obsoleto y se eliminará en la versión 3.11. (Contribuido por Yury Selivanov y Kyle Stanley en bpo-34790.)binhex4 and hexbin4 standards are now deprecated. The
binhex
module and the followingbinascii
functions are now deprecated:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Contribuido por Victor Stinner en bpo-39353.)
Las clases
ast
slice
,Index
yExtSlice
se consideran obsoletas y se eliminarán en futuras versiones de Python. El propiovalue
debe utilizarse en lugar deIndex(value)
. Se debe utilizarTuple(slices, Load())
en lugar deExtSlice(slices)
. (Contribuido por Serhiy Storchaka en bpo-34822.)Las clases
ast
Suite
,Param
,AugLoad
yAugStore
se consideran obsoletas y se eliminarán en futuras versiones de Python. No fueron generados por el analizador y no aceptados por el generador de código en Python 3. (Contribuido por Batuhan Taskaya en bpo-39639 y bpo-39969 y Serhiy Storchaka en bpo-39988).The
PyEval_InitThreads()
andPyEval_ThreadsInitialized()
functions are now deprecated and will be removed in Python 3.11. CallingPyEval_InitThreads()
now does nothing. The GIL is initialized byPy_Initialize()
since Python 3.7. (Contributed by Victor Stinner in bpo-39877.)Pasar
None
como primer argumento a la funciónshlex.split()
ha quedado obsoleto. (Contribuido por Zackery Spytz en bpo-33262.)smtpd.MailmanProxy()
is now deprecated as it is unusable without an external module,mailman
. (Contributed by Samuel Colvin in bpo-35800.)The
lib2to3
module now emits aPendingDeprecationWarning
. Python 3.9 switched to a PEG parser (see PEP 617), and Python 3.10 may include new language syntax that is not parsable by lib2to3’s LL(1) parser. Thelib2to3
module may be removed from the standard library in a future Python version. Consider third-party alternatives such as LibCST or parso. (Contributed by Carl Meyer in bpo-40360.)El parámetro random de
random.shuffle()
ha quedado obsoleto. (Contribuido por Raymond Hettinger en bpo-40465)
Remoto¶
The erroneous version at
unittest.mock.__version__
has been removed.nntplib.NNTP
:xpath()
andxgtitle()
methods have been removed. These methods are deprecated since Python 3.3. Generally, these extensions are not supported or not enabled by NNTP server administrators. Forxgtitle()
, please usenntplib.NNTP.descriptions()
ornntplib.NNTP.description()
instead. (Contributed by Donghee Na in bpo-39366.)array.array
: Se han eliminado los métodostostring()
yfromstring()
. Eran alias detobytes()
yfrombytes()
, obsoletos desde Python 3.2. (Contribuido por Victor Stinner en bpo-38916.)Se ha eliminado la función
sys.callstats()
sin documentar. Desde Python 3.7, quedó obsoleto y siempre devolvióNone
. Requería una opción de compilación especialCALL_PROFILE
que ya se eliminó en Python 3.7. (Contribuido por Victor Stinner en bpo-37414.)Se han eliminado las funciones
sys.getcheckinterval()
ysys.setcheckinterval()
. Fueron obsoletos desde Python 3.2. Utilicesys.getswitchinterval()
ysys.setswitchinterval()
en su lugar. (Contribuido por Victor Stinner en bpo-37392.)Se ha eliminado la función C
PyImport_Cleanup()
. Se documentó como: «Vacíe la tabla del módulo. Solo para uso interno». (Contribuido por Victor Stinner en bpo-36710.)Se han eliminado los módulos
_dummy_thread
ydummy_threading
. Estos módulos quedaron obsoletos desde Python 3.7, que requiere compatibilidad con subprocesos. (Contribuido por Victor Stinner en bpo-37312.)aifc.openfp()
alias toaifc.open()
,sunau.openfp()
alias tosunau.open()
, andwave.openfp()
alias towave.open()
have been removed. They were deprecated since Python 3.7. (Contributed by Victor Stinner in bpo-37320.)The
isAlive()
method ofthreading.Thread
has been removed. It was deprecated since Python 3.8. Useis_alive()
instead. (Contributed by Donghee Na in bpo-37804.)Se han eliminado los métodos
getchildren()
ygetiterator()
de las clasesElementTree
yElement
en el móduloElementTree
. Fueron obsoletos en Python 3.2. Utiliceiter(x)
olist(x)
en lugar dex.getchildren()
yx.iter()
olist(x.iter())
en lugar dex.getiterator()
. (Contribuido por Serhiy Storchaka en bpo-36543.)Se eliminó la antigua API
plistlib
, quedó en desuso desde Python 3.4. Utilice las funcionesload()
,loads()
,dump()
ydumps()
. Además, se eliminó el parámetro use_builtin_types; en su lugar, siempre se utilizan objetosbytes
estándar. (Contribuido por Jon Janzen en bpo-36409.)Se ha eliminado la función C
PyGen_NeedsFinalizing
. No se documentó, probó ni usó en ningún lugar dentro de CPython después de la implementación de PEP 442. Parche de Joannah Nanjekye. (Contribuido por Joannah Nanjekye en bpo-15088)base64.encodestring()
ybase64.decodestring()
, los alias obsoletos desde Python 3.1, se han eliminado: utilicebase64.encodebytes()
ybase64.decodebytes()
en su lugar. (Contribuido por Victor Stinner en bpo-39351.)La función
fractions.gcd()
se ha eliminado, está obsoleta desde Python 3.5 (bpo-22486): utilicemath.gcd()
en su lugar. (Contribuido por Victor Stinner en bpo-39350.)Se ha eliminado el parámetro buffering de
bz2.BZ2File
. Desde Python 3.0, se ignoró y su uso emitió unDeprecationWarning
. Pase un objeto de archivo abierto para controlar cómo se abre el archivo. (Contribuido por Victor Stinner en bpo-39357.)Se ha eliminado el parámetro encoding de
json.loads()
. A partir de Python 3.1, fue obsoleto e ignorado; su uso ha emitido unDeprecationWarning
desde Python 3.8. (Contribuido por Inada Naoki en bpo-39377)Las declaraciones
with (await asyncio.lock):
ywith (yield from asyncio.lock):
ya no son compatibles, utiliceasync with lock
en su lugar. Lo mismo es correcto paraasyncio.Condition
yasyncio.Semaphore
. (Contribuido por Andrew Svetlov en bpo-34793.)The
sys.getcounts()
function, the-X showalloccount
command line option and theshow_alloc_count
field of the C structurePyConfig
have been removed. They required a special Python build by definingCOUNT_ALLOCS
macro. (Contributed by Victor Stinner in bpo-39489.)Se ha eliminado el atributo
_field_types
de la clasetyping.NamedTuple
. Quedó en desuso desde Python 3.8. En su lugar, utilice el atributo__annotations__
. (Contribuido por Serhiy Storchaka en bpo-40182.)The
symtable.SymbolTable.has_exec()
method has been removed. It was deprecated since 2006, and only returningFalse
when it’s called. (Contributed by Batuhan Taskaya in bpo-40208)The
asyncio.Task.current_task()
andasyncio.Task.all_tasks()
have been removed. They were deprecated since Python 3.7 and you can useasyncio.current_task()
andasyncio.all_tasks()
instead. (Contributed by Rémi Lapeyre in bpo-40967)El método
unescape()
en la clasehtml.parser.HTMLParser
se ha eliminado (quedó obsoleto desde Python 3.4).html.unescape()
debe usarse para convertir referencias de caracteres a los caracteres Unicode correspondientes.
Portar a Python 3.9¶
Esta sección enumera los cambios descritos anteriormente y otras correcciones de errores que pueden requerir cambios en su código.
Cambios en la API de Python¶
__import__()
yimportlib.util.resolve_name()
ahora lanzanImportError
donde anteriormente lanzabanValueError
. Las personas que llaman que detectan el tipo de excepción específico y son compatibles con Python 3.9 y versiones anteriores deberán detectar ambas usandoexcept (ImportError, ValueError):
.Los scripts de activación de
venv
ya no son casos especiales cuando__VENV_PROMPT__
se establece en""
.The
select.epoll.unregister()
method no longer ignores theEBADF
error. (Contributed by Victor Stinner in bpo-39239.)Se ha eliminado el parámetro compresslevel
bz2.BZ2File
se convirtió solo en un parámetro de llave, ya que buffering se quitó. (Contribuido por Victor Stinner en bpo-39357.)AST simplificado para suscripción. Los índices simples se representarán por su valor, los segmentos extendidos se representarán como tuplas.
Index(value)
devolverá unvalue
en sí mismo,ExtSlice(slices)
devolveráTuple(slices, Load())
. (Contribuido por Serhiy Storchaka en bpo-34822.)El módulo
importlib
ahora ignora la variable de entornoPYTHONCASEOK
cuando se utilizan las opciones de línea de comando-E
o-I
.El parámetro encoding se ha agregado a las clases
ftplib.FTP
yftplib.FTP_TLS
como un parámetro de solo palabra clave, y la codificación predeterminada se cambia de Latin-1 a UTF-8 para seguir: rfc: 2640.asyncio.loop.shutdown_default_executor()
se ha agregado aAbstractEventLoop
, lo que significa que los bucles de eventos alternativos que heredan de él deben tener definido este método. (Contribuido por Kyle Stanley en bpo-34037.)Los valores constantes de los indicadores futuros en el módulo
__future__
se actualizan para evitar la colisión con los indicadores del compilador. Anteriormente,PyCF_ALLOW_TOP_LEVEL_AWAIT
chocaba conCO_FUTURE_DIVISION
. (Contribuido por Batuhan Taskaya en bpo-39562)array('u')
now useswchar_t
as C type instead ofPy_UNICODE
. This change doesn’t affect to its behavior becausePy_UNICODE
is alias ofwchar_t
since Python 3.3. (Contributed by Inada Naoki in bpo-34538.)La API
logging.getLogger()
ahora devuelve el registrador raíz cuando se le pasó el nombre'root'
, mientras que anteriormente devolvía un registrador no raíz llamado'root'
. Esto podría afectar los casos en los que el código de usuario desea explícitamente un registrador no root llamado'root'
, o crea una instancia de un registrador usandologging.getLogger(__name__)
en algún módulo de nivel superior llamado'root.py'
. (Contribuido por Vinay Sajip en bpo-37742.)Division handling of
PurePath
now returnsNotImplemented
instead of raising aTypeError
when passed something other than an instance ofstr
orPurePath
. This allows creating compatible classes that don’t inherit from those mentioned types. (Contributed by Roger Aiudi in bpo-34775).A partir de Python 3.9.5, el módulo
ipaddress
ya no acepta ceros a la izquierda en las cadenas de direcciones IPv4. Los ceros iniciales son ambiguos y algunas bibliotecas los interpretan como notación octal. Por ejemplo, la función heredadasocket.inet_aton()
trata los ceros iniciales como una notación octal. La implementación glibc delinet_pton()
moderno no acepta ceros a la izquierda. (Contribuido por Christian Heimes en bpo-36384).codecs.lookup()
ahora normaliza el nombre de codificación de la misma manera queencodings.normalize_encoding()
, excepto quecodecs.lookup()
también convierte el nombre a minúsculas. Por ejemplo, el nombre de codificación"latex+latin1"
ahora está normalizado a"latex_latin1"
. (Contribuido por Jordon Xu en bpo-37751.)
Cambios en la API de C¶
Las instancias de heap-allocated types (como las creadas con
PyType_FromSpec()
y API similares) contienen una referencia a su objeto de tipo desde Python 3.8. Como se indica en los «Cambios en la API C» de Python 3.8, para la gran mayoría de los casos, no debería haber efectos secundarios, pero para los tipos que tienen una función personalizadatp_traverse
, asegúrese de que todas las funcionestp_traverse
personalizadas de los tipos asignados al montón visitan el tipo del objeto.Ejemplo:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
Si su función transversal delega en
tp_traverse
de su clase base (u otro tipo), asegúrese de quePy_TYPE(self)
se visite solo una vez. Tenga en cuenta que solo se espera que heap type visite el tipo entp_traverse
.Por ejemplo, si su función
tp_traverse
incluye:base->tp_traverse(self, visit, arg)
Luego añade:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (bpo-35810 and bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
(Consulte bpo-35810 y bpo-40217 para obtener más información).
Las funciones
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
yPyEval_CallObjectWithKeywords
están en desuso. UtilicePyObject_Call()
y sus variantes en su lugar. (Ver más detalles en bpo-29548.)
Cambios en el código de bytes de CPython¶
Se agregó el código de operación
LOAD_ASSERTION_ERROR
para manejar la declaraciónassert
. Anteriormente, la declaración de aserción no funcionaría correctamente si la excepciónAssertionError
estuviera siendo sombreada. (Contribuido por Zackery Spytz en bpo-34880.)El código de operación
COMPARE_OP
se dividió en cuatro instrucciones distintas:COMPARE_OP
para comparaciones enriquecidasIS_OP
para pruebas “es” y “no es”CONTAINS_OP
para pruebas “in” y “not in”JUMP_IF_NOT_EXC_MATCH
para verificar las excepciones en las declaraciones “try-except”.
(Contribuido por Mark Shannon en bpo-39156.)
Construir cambios¶
Added
--with-platlibdir
option to theconfigure
script: name of the platform-specific library directory, stored in the newsys.platlibdir
attribute. Seesys.platlibdir
attribute for more information. (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)Se ha eliminado la macro de compilación especial
COUNT_ALLOCS
. (Contribuido por Victor Stinner en bpo-39489.)On non-Windows platforms, the
setenv()
andunsetenv()
functions are now required to build Python. (Contributed by Victor Stinner in bpo-39395.)En plataformas que no son de Windows, la creación de instaladores
bdist_wininst
ahora no es compatible oficialmente. (Consulte bpo-10945 para obtener más detalles).Al compilar Python en macOS desde la fuente,
_tkinter
ahora se vincula con marcos Tcl y Tk que no son del sistema si están instalados en/Library/Frameworks
, como había sido el caso en versiones anteriores de macOS. Si un SDK de macOS está configurado explícitamente, mediante--enable-universalsdk
o-isysroot
, solo se busca en el SDK. El comportamiento predeterminado aún se puede anular con –with-tcltk-includes y –with-tcltk-libs. (Contribuido por Ned Deily en bpo-34956.)Python ahora se puede construir para Windows 10 ARM64. (Contribuido por Steve Dower en bpo-33125.)
Algunas pruebas individuales ahora se omiten cuando se usa
--pgo
. Las pruebas en cuestión aumentaron significativamente el tiempo de la tarea PGO y probablemente no ayudaron a mejorar la optimización del ejecutable final. Esto acelera la tarea en un factor de aproximadamente 15 veces. La ejecución del conjunto de pruebas unitarias completo es lenta. Este cambio puede resultar en una compilación ligeramente menos optimizada ya que no se ejecutarán tantas ramas de código. Si está dispuesto a esperar la compilación mucho más lenta, el comportamiento anterior se puede restaurar usando./configure [..] PROFILE_TASK="-m test --pgo-extended"
. No garantizamos qué conjunto de tareas de PGO produce una compilación más rápida. Los usuarios interesados deben ejecutar sus propios puntos de referencia relevantes, ya que los resultados pueden depender del entorno, la carga de trabajo y la cadena de herramientas del compilador. (Consulte bpo-36044 y bpo-37707 para obtener más detalles).
Cambios en la API de C¶
Nuevas características¶
PEP 573: Added
PyType_FromModuleAndSpec()
to associate a module with a class;PyType_GetModule()
andPyType_GetModuleState()
to retrieve the module and its state; andPyCMethod
andMETH_METHOD
to allow a method to access the class it was defined in. (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)Se agregó la función
PyFrame_GetCode()
: obtenga un código de marco. Se agregó la funciónPyFrame_GetBack()
: obtenga el siguiente marco exterior del marco. (Contribuido por Victor Stinner en bpo-40421.)Se agregó
PyFrame_GetLineNumber()
a la API C limitada. (Contribuido por Victor Stinner en bpo-40421.)Se agregaron funciones
PyThreadState_GetInterpreter()
yPyInterpreterState_Get()
para obtener el intérprete. Se agregó la funciónPyThreadState_GetFrame()
para obtener el marco actual de un estado de subproceso de Python. Se agregó la funciónPyThreadState_GetID()
: obtenga el identificador único de un estado de subproceso de Python. (Contribuido por Victor Stinner en bpo-39947.)Se agregó una nueva función pública
PyObject_CallNoArgs()
a la API de C, que llama a un objeto de Python invocable sin ningún argumento. Es la forma más eficiente de llamar a un objeto de Python invocable sin ningún argumento. (Contribuido por Victor Stinner en bpo-37194.)Cambios en la API C limitada (si se define la macro
Py_LIMITED_API
):Proporcione
Py_EnterRecursiveCall()
yPy_LeaveRecursiveCall()
como funciones regulares para la API limitada. Anteriormente, se definían como macros, pero estas macros no se compilaban con la API C limitada que no puede acceder al campoPyThreadState.recursion_depth
(la estructura es opaca en la API C limitada).PyObject_INIT()
yPyObject_INIT_VAR()
se convierten en funciones «opacas» habituales para ocultar los detalles de la implementación.
The
PyModule_AddType()
function is added to help adding a type to a module. (Contributed by Donghee Na in bpo-40024.)Se agregaron las funciones
PyObject_GC_IsTracked()
yPyObject_GC_IsFinalized()
a la API pública para permitir consultar si los objetos de Python se están rastreando actualmente o si ya han sido finalizados por el recolector de basura, respectivamente. (Contribuido por Pablo Galindo Salgado en bpo-40241.)Added
_PyObject_FunctionStr()
to get a user-friendly string representation of a function-like object. (Patch by Jeroen Demeyer in bpo-37645.)Se agregó
PyObject_CallOneArg()
para llamar a un objeto con un argumento posicional (parche de Jeroen Demeyer en bpo-37483).
Portar a Python 3.9¶
PyInterpreterState.eval_frame
(PEP 523) ahora requiere un nuevo parámetro tstate obligatorio (PyThreadState*
). (Contribuido por Victor Stinner en bpo-38500.)Módulos de extensión:
m_traverse
,m_clear
ym_free
Las funciones dePyModuleDef
ya no se llaman si el estado del módulo era solicitado pero aún no asignado. Este es el caso inmediatamente después de que se crea el módulo y antes de que se ejecute (funciónPy_mod_exec
). Más precisamente, estas funciones no se llaman sim_size
es mayor que 0 y el estado del módulo (como lo devuelvePyModule_GetState()
) esNULL
.Los módulos de extensión sin estado de módulo (
m_size <= 0
) no se ven afectados.Si se llama a
Py_AddPendingCall()
en un subinterpretador, la función ahora está programada para ser llamada desde el subinterpretador, en lugar de ser llamada desde el intérprete principal. Cada subinterpretador ahora tiene su propia lista de llamadas programadas. (Contribuido por Victor Stinner en bpo-39984.)El registro de Windows ya no se usa para inicializar
sys.path
cuando se usa la opción-E
(siPyConfig.use_environment
está configurado en0
). Esto es importante al incrustar Python en Windows. (Contribuido por Zackery Spytz en bpo-8901.)La variable global
PyStructSequence_UnnamedField
ahora es una constante y se refiere a una cadena constante. (Contribuido por Serhiy Storchaka en bpo-38650.)The
PyGC_Head
structure is now opaque. It is only defined in the internal C API (pycore_gc.h
). (Contributed by Victor Stinner in bpo-40241.)The
Py_UNICODE_COPY
,Py_UNICODE_FILL
,PyUnicode_WSTR_LENGTH
,PyUnicode_FromUnicode()
,PyUnicode_AsUnicode()
,_PyUnicode_AsUnicode
, andPyUnicode_AsUnicodeAndSize()
are marked as deprecated in C. They have been deprecated by PEP 393 since Python 3.3. (Contributed by Inada Naoki in bpo-36346.)La función
Py_FatalError()
se reemplaza con una macro que registra automáticamente el nombre de la función actual, a menos que se defina la macroPy_LIMITED_API
. (Contribuido por Victor Stinner en bpo-39882.)El protocolo vectorcall ahora requiere que la persona que llama solo pase cadenas como nombres de palabras clave. (Consulte bpo-37540 para obtener más información).
Los detalles de implementación de una serie de macros y funciones ahora están ocultos:
La macro
PyObject_IS_GC()
se convirtió en una función.The
PyObject_NEW()
macro becomes an alias to thePyObject_New
macro, and thePyObject_NEW_VAR()
macro becomes an alias to thePyObject_NewVar
macro. They no longer access directly thePyTypeObject.tp_basicsize
member.PyObject_GET_WEAKREFS_LISTPTR()
macro was converted to a function: the macro accessed directly thePyTypeObject.tp_weaklistoffset
member.La macro
PyObject_CheckBuffer()
se convirtió en una función: la macro accedió directamente al miembroPyTypeObject.tp_as_buffer
.PyIndex_Check()
ahora siempre se declara como una función opaca para ocultar los detalles de implementación: se eliminó la macroPyIndex_Check()
. La macro accedió directamente al miembroPyTypeObject.tp_as_number
.
(Consulte bpo-40170 para obtener más detalles).
Remoto¶
Se excluyeron las macros
PyFPE_START_PROTECT()
yPyFPE_END_PROTECT()
depyfpe.h
de la API C limitada. (Contribuido por Victor Stinner en bpo-38835.)Se ha eliminado la ranura
tp_print
de PyTypeObject. Se usó para imprimir objetos en archivos en Python 2.7 y antes. Desde Python 3.0, se ha ignorado y no se ha utilizado. (Contribuido por Jeroen Demeyer en bpo-36974.)Cambios en la API C limitada (si se define la macro
Py_LIMITED_API
):Se excluyeron las siguientes funciones de la API C limitada:
PyThreadState_DeleteCurrent()
(Contribuido por Joannah Nanjekye en bpo-37878.)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
El mecanismo de papelera que nunca funcionó en la API C limitada.
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
Se movieron las siguientes funciones y definiciones a la API de C interna:
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(específico paraPy_TRACE_REFS
acumulación)
Se eliminó el gancho
_PyRuntime.getframe
y se eliminó la macro_PyThreadState_GetFrame
, que era un alias de_PyRuntime.getframe
. Solo fueron expuestos por la API C interna. También se eliminó el tipoPyThreadFrameGetter
. (Contribuido por Victor Stinner en bpo-39946.)Se eliminaron las siguientes funciones de la API de C. Llame a
PyGC_Collect()
explícitamente para borrar todas las listas libres. (Contribuido por Inada Naoki y Victor Stinner en bpo-37340, bpo-38896 y bpo-40428.)PyAsyncGen_ClearFreeLists()
PyContext_ClearFreeList()
PyDict_ClearFreeList()
PyFloat_ClearFreeList()
PyFrame_ClearFreeList()
PyList_ClearFreeList()
PyMethod_ClearFreeList()
yPyCFunction_ClearFreeList()
: se han eliminado las listas libres de objetos de método enlazados.PySet_ClearFreeList()
: la lista de conjuntos libres se ha eliminado en Python 3.4.PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
: la lista libre de Unicode se ha eliminado en Python 3.3.
Función
_PyUnicode_ClearStaticStrings()
eliminada. (Contribuido por Victor Stinner en bpo-39465.)Eliminado
Py_UNICODE_MATCH
. Ha sido obsoleto por PEP 393 y roto desde Python 3.3. En su lugar, se puede utilizar la funciónPyUnicode_Tailmatch()
. (Contribuido por Inada Naoki en bpo-36346.)Archivos de encabezado limpios de interfaces definidas pero sin implementación. Los símbolos API públicos que se eliminan son:
_PyBytes_InsertThousandsGroupingLocale
,_PyBytes_InsertThousandsGrouping
,_Py_InitializeFromArgs
,_Py_InitializeFromWideArgs
,_PyFloat_Repr
,_PyFloat_Digits
,_PyFloat_DigitsInit
,PyFrame_ExtendStack
,_PyAIterWrapper_Type
,PyNullImporter_Type
,PyCmpWrapper_Type
,PySortWrapper_Type
,PyNoArgsFunction
. (Contribuido por Pablo Galindo Salgado en bpo-39372.)
Cambios notables en Python 3.9.1¶
mecanografía¶
El comportamiento de typing.Literal
se modificó para cumplir con PEP 586 y para coincidir con el comportamiento de los verificadores de tipo estático especificados en el PEP.
Literal
ahora elimina los parámetros duplicados.Las comparaciones de igualdad entre objetos
Literal
ahora son independientes del orden.Las comparaciones de
Literal
ahora respetan los tipos. Por ejemplo,Literal[0] == Literal[False]
evaluado previamente comoTrue
. Ahora esFalse
. Para respaldar este cambio, la caché de tipos utilizada internamente ahora admite tipos diferenciados.Los objetos
Literal
ahora lanzarán una excepciónTypeError
durante las comparaciones de igualdad si alguno de sus parámetros no es hashable. Tenga en cuenta que declararLiteral
con parámetros mutables no arrojará un error:>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(Contribuido por Yurii Karabas en bpo-42345.)
Compatibilidad con macOS 11.0 (Big Sur) y Apple Silicon Mac¶
A partir de 3.9.1, Python ahora es totalmente compatible con la construcción y ejecución en macOS 11.0 (Big Sur) y en Apple Silicon Macs (basado en la arquitectura ARM64
). Una nueva variante de compilación universal, universal2
, ahora está disponible para admitir de forma nativa tanto ARM64
como Intel 64
en un conjunto de ejecutables. Los binarios ahora también se pueden construir en versiones actuales de macOS para ser implementados en una variedad de versiones anteriores de macOS (probadas a 10.9) mientras hacen que algunas funciones y opciones más nuevas del sistema operativo estén disponibles condicionalmente según la versión del sistema operativo en uso en tiempo de ejecución («vinculación débil» ).
(Contribuido por Ronald Oussoren y Lawrence D’Anna en bpo-41100.)
Cambios notables en Python 3.9.2¶
colecciones.abc¶
collections.abc.Callable
genérico ahora aplana los parámetros de tipo, similar a lo que hace actualmente typing.Callable
. Esto significa que collections.abc.Callable[[int, str], str]
tendrá __args__
de (int, str, str)
; anteriormente esto era ([int, str], str)
. Para permitir este cambio, types.GenericAlias
ahora puede ser subclasificado, y se devolverá una subclase al subíndice el tipo collections.abc.Callable
. El código que accede a los argumentos a través de typing.get_args()
o __args__
debe tener en cuenta este cambio. Se puede emitir un DeprecationWarning
para formas no válidas de parametrizar collections.abc.Callable
que pueden haber pasado silenciosamente en Python 3.9.1. Este DeprecationWarning
se convertirá en un TypeError
en Python 3.10. (Contribuido por Ken Jin en bpo-42195.)
urllib.parse¶
Earlier Python versions allowed using both ;
and &
as
query parameter separators in urllib.parse.parse_qs()
and
urllib.parse.parse_qsl()
. Due to security concerns, and to conform with
newer W3C recommendations, this has been changed to allow only a single
separator key, with &
as the default. This change also affects
cgi.parse()
and cgi.parse_multipart()
as they use the affected
functions internally. For more details, please see their respective
documentation.
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)
Notable changes in Python 3.9.3¶
A security fix alters the ftplib.FTP
behavior to not trust the
IPv4 address sent from the remote server when setting up a passive data
channel. We reuse the ftp server IP address instead. For unusual code
requiring the old behavior, set a trust_server_pasv_ipv4_address
attribute on your FTP instance to True
. (See gh-87451)
Notable changes in Python 3.9.5¶
urllib.parse¶
The presence of newline or tab characters in parts of a URL allows for some
forms of attacks. Following the WHATWG specification that updates RFC 3986,
ASCII newline \n
, \r
and tab \t
characters are stripped from the
URL by the parser in urllib.parse
preventing such attacks. The removal
characters are controlled by a new module level variable
urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (See gh-88048)
Notable security feature in 3.9.14¶
Converting between int
and str
in bases other than 2
(binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal)
now raises a ValueError
if the number of digits in string form is
above a limit to avoid potential denial of service attacks due to the
algorithmic complexity. This is a mitigation for CVE 2020-10735.
This limit can be configured or disabled by environment variable, command
line flag, or sys
APIs. See the integer string conversion
length limitation documentation. The default limit
is 4300 digits in string form.
Notable changes in 3.9.17¶
tarfile¶
The extraction methods in
tarfile
, 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.)