Qué hay de nuevo en Python 3.7¶
- Editor:
Elvis Pranskevichus <elvis@magic.io>
El artículo explica las nuevas características en Python 3.7, comparado con 3.6. Python 3.7 fue lanzado el 27, Junio, 2018. Para más detalles, consultar la changelog.
Resumen – Lanzamientos Destacados¶
Sintaxis de nuevas características:
PEP 563, evaluación pospuesta de anotaciones de tipo.
Cambios de sintaxis incompatibles hacia atrás:
Nuevos módulos de biblioteca:
Nuevas funciones integradas:
PEP 553, la nueva función
breakpoint()
.
Mejoras en el modelo de datos de Python:
PEP 562, personalización del acceso a los atributos del módulo.
PEP 560, soporte básico para módulo de mecanografía y tipos genéricos.
la naturaleza de conservación del orden de inserción de objetos dict han sido declarado para ser una parte oficial de la especificación del lenguaje Python.
Mejoras significativas in la librería estándar:
El modulo
asyncio
ha recibido nuevas funciones, significativas mejoras de usabilidad y rendimiento.El modulo
time
adquirió soporte de funciones con resolución de nanosegundos.
Mejoras en la implementación de CPython:
Evitando el uso de ASCII como codificación de texto predeterminada:
PEP 552, determinista .pycs
PEP 565, manejo mejorado
DeprecationWarning
Mejoras en la API de C:
PEP 539, nueva API de C para almacenamiento local de subprocesos
Mejoras de Documentación:
PEP 545, Traducción de documentación de Python
Nuevas traducciones de documentación: Japonés, Francés, y Coreano.
Esta versión presenta notables mejoras de rendimiento en muchas áreas. La sección Optimizaciones los enumera en detalle.
Para obtener una lista de cambios que pueden afectar la compatibilidad con versiones anteriores de Python por favor consultar la sección Portando a Python 3.7.
Nuevas Características¶
PEP 563: Evaluación pospuesta de anotaciones¶
La llegada de las sugerencias de tipo en Python descubrió dos problemas de usabilidad evidentes con la funcionalidad de las anotaciones agregadas en PEP 3107 y mas refinado en PEP 526:
las anotaciones solo podían usar nombres que ya estaban disponibles en el alcance actual, en otras palabras, no admitían referencias futuras de ningún tipo; y
anotar el código fuente tuvo efectos adversos en el tiempo de inicio de los programas Python.
Ambos problemas se solucionan posponiendo la evaluación de anotaciones. En lugar de compilar código que ejecuta expresiones en anotaciones en su momento de definición, el compilador almacena la anotación en forma de cadena equivalente al AST de la expresión en cuestión. Si es necesario, las anotaciones se pueden resolver en tiempo de ejecución usando typing.get_type_hints()
. En el común de los casos esto no es necesario, las anotaciones son más fáciles de almacenar (dado que las cadenas cortas son internadas por el intérprete.) y hacen que el tiempo de inicio sea mas rápido.
En términos de usabilidad, las anotaciones ahora admiten referencias hacia adelante, lo que hace que la siguiente sintaxis sea válida:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
Dado que este cambio rompe la compatibilidad, el nuevo comportamiento debe habilitarse por modulo en Python 3.7 usando una importación __future__
:
from __future__ import annotations
Se convertirá en el predeterminado en Python 3.10.
Ver también
- PEP 563 – Evaluación aplazada de anotaciones
PEP escrito y implementado por Łukasz Langa.
PEP 538: Coerción de configuración regional del Legado de C¶
Un desafío continuo dentro de la serie Python 3 ha sido determinar una estrategia predeterminada sensata para manejar el supuesto de codificación de texto “ASCII de 7 bits” implícito actualmente en el uso de la configuración regional C o POSIX predeterminada en plataformas que no son Windows.
PEP 538 actualiza la interfaz de línea de comandos del intérprete predeterminada para convertir automáticamente esa configuración regional en una configuración regional basada en UTF-8 disponible, como se describe en la documentación de la nueva variable de entorno PYTHONCOERCECLOCALE
. Configurar automáticamente LC_CTYPE
de esta manera significa que tanto el intérprete central como las extensiones C que reconocen la configuración regional (por ejemplo readline
) asumirá el uso de UTF-8 como codificación de texto predeterminada, en lugar de ASCII.
La definición de soporte de plataforma en PEP 11 también se ha actualizado para limitar la compatibilidad con el manejo de texto completo a configuraciones regionales no basadas en ASCII configuradas adecuadamente.
Como parte de este cambio, el controlador de errores predeterminado para stdin
y stdout
es ahora surrogateescape
(antes que strict
) al usar cualquiera de las configuraciones regionales de destino de coerción definidas (actualmente C.UTF-8
, C.utf8
, y UTF-8
). El controlador de errores predeterminado para stderr
continua siendo backslashreplace
, independientemente de local.
La coerción local es silenciosa de forma predeterminada, pero para ayudar a depurar problemas de integración potencialmente relacionados con la configuración regional, advertencias explícitas (emitido directamente en stderr
) se puede solicitar configurando PYTHONCOERCECLOCALE=warn
. Esta configuración también hará que el tiempo de ejecución de Python emita una advertencia si la configuración regional C heredada permanece activa cuando se inicializa el intérprete principal.
Mientras la coerción local PEP 538 tiene la ventaja de afectar también a los módulos de extensión (como GNU readline
), así como procesos secundarios (incluidos los que ejecutan aplicaciones que no son de Python y versiones anteriores de Python), tiene la desventaja de requerir que esté presente una ubicación de destino adecuada en el sistema en ejecución. Para manejar mejor el caso en el que no hay una configuración regional de destino adecuada disponible (como ocurre en RHEL / CentOS 7, por ejemplo), Python 3.7 también implementa PEP 540: Modo de tiempo de ejecución UTF-8 forzado.
Ver también
- PEP 538 – Coaccionar la configuración regional C heredada a una configuración regional basada en UTF-8
PEP escrito y implementado por Nick Coghlan.
PEP 540: Modo de tiempo de ejecución UTF-8 forzado¶
La nueva opción de lineas de comando -X
utf8
y la variable de entorno PYTHONUTF8
se puede utilizar para habilitar el modo Python UTF-8.
Cuando está en modo UTF-8, CPython ignora la configuración regional y usa la codificación UTF-8 de forma predeterminada. Los controladores de errores para los flujos sys.stdin
y sys.stdout
se establecen en surrogateescape
.
El modo UTF-8 forzado se puede usar para cambiar el comportamiento de manejo de texto en un intérprete de Python integrado sin cambiar la configuración regional de una aplicación de inserción.
Mientras el modo UTF-8 PEP 540 tiene la ventaja de funcionar independientemente de las configuraciones regionales disponibles en el sistema en ejecución, tiene la desventaja de no tener ningún efecto en los módulos de extensión (como GNU readline
), procesos secundarios que ejecutan aplicaciones que no son de Python y procesos secundarios que ejecutan versiones anteriores de Python. Para reducir el riesgo de dañar los datos de texto al comunicarse con dichos componentes, Python 3.7 también implementa PEP 540: Modo de tiempo de ejecución UTF-8 forzado.
El modo UTF-8 está habilitado de forma predeterminada cuando la configuración regional es C
o POSIX
, y la función de coerción local PEP 538 no lo cambia a una alternativa basada en UTF-8 (si ese fallo se debe a que se ha establecido PYTHONCOERCECLOCALE=0
, LC_ALL
se esta configurando, o la falta de un lugar de destino adecuado).
Ver también
- PEP 540 – Agrega un nuevo modo UTF-8
PEP escrito y implementado por Victor Stinner
PEP 553: Incorporada en breakpoint()
¶
Python 3.7 incluye la nueva función incorporada breakpoint()
como una forma fácil y consistente de ingresar al depurador de Python.
Llamadas breakpoint()
incorporadas en sys.breakpointhook()
. Por defecto, este último importa pdb
y luego llama pdb.set_trace()
, pero vinculando sys.breakpointhook()
a la función de su elección, breakpoint()
puede entrar en cualquier depurador. Adicionalmente, la variable de entorno PYTHONBREAKPOINT
se puede configurar como el depurador que elija. Configure PYTHONBREAKPOINT=0
para deshabilitar completamente el breakpoint()
.
Ver también
- PEP 553 – Incorporada en breakpoint()
PEP escrito y implementado por Barry Warsaw
PEP 539: Nueva API C para almacenamiento local de subprocesos¶
Mientras que Python proporciona una API C para soporte de almacenamiento local de subprocesos; el Thread Local Storage (TLS) API existente ha usado int para representar claves TLS en todas las plataformas. En general, esto no ha sido un problema para las plataformas de soporte oficial, pero no es compatible con POSIX ni portátil en ningún sentido práctico.
PEP 539 cambia esto al proporcionar un nuevo Thread Specific Storage (TSS) API a CPython que reemplaza el uso de la API TLS existente dentro del intérprete de CPython, al tiempo que deja obsoleta la API existente. La API de TSS utiliza un nuevo tipo Py_tss_t
en lugar de int para representar claves TSS, un tipo opaco cuya definición puede depender de la implementación de TLS subyacente. Por lo tanto, esto permitirá compilar CPython en plataformas donde la clave TLS nativa se define de una manera que no se puede convertir de manera segura a int.
Tenga en cuenta que en las plataformas en las que la clave TLS nativa se define de una manera que no se puede convertir de forma segura a int, todas las funciones de la API de TLS existente no funcionarán e inmediatamente devolverán un error. Esto indica claramente que la antigua API no es compatible con plataformas en las que no se puede usar de manera confiable y que no se hará ningún esfuerzo para agregar dicho soporte.
Ver también
- PEP 539 – Un nueva API-C para almacenamiento local de subprocesos en CPython
PEP escrito por Erik M. Bray; implementación por Masayuki Yamamoto.
PEP 562: Personalización del acceso a los atributos del módulo¶
Python 3.7 permite definir __getattr__()
en módulos y lo llamará siempre que no se encuentre un atributo de módulo. Definir __dir__()
en modules ahora también esta permitido.
Un ejemplo típico de dónde esto puede ser útil es la desaprobación de los atributos del módulo y la carga diferida.
Ver también
- PEP 562 – Módulo
__getattr__
y__dir__
PEP escrito y implementado por Ivan Levkivskyi
PEP 564: Nuevas funciones de tiempo con resolución de nanosegundos¶
La resolución de los relojes en los sistemas modernos puede superar la precisión limitada de un número de punto flotante devuelto por la función time.time()
y sus variantes. Para evitar la pérdida de precisión, PEP 564 agrega seis nuevas variantes de «nanosegundos» de las funciones de temporizador existentes al módulo time
:
Las nuevas funciones devuelven el número de nanosegundos como un valor entero.
Measurements muestra que en Linux y Windows la resolución de time.time_ns()
es aproximadamente 3 veces mejor que la de time.time()
.
Ver también
- PEP 564 – Agrega nuevas funciones de tiempo y resolución de nanosegundos
PEP escrito y implementado por Victor Stinner
PEP 565: Mostrar DeprecationWarning en __main__
¶
El manejo predeterminado de DeprecationWarning
Se ha cambiado de modo que estas advertencias se muestren una vez más de forma predeterminada, pero solo cuando el código que las activa se ejecuta directamente en el módulo __main__
. Como resultado, los desarrolladores de scripts de un solo archivo y aquellos que usan Python de forma interactiva deberían comenzar a ver una vez más advertencias de desaprobación para las API que usan, pero las advertencias de desaprobación activadas por la aplicación importada, la biblioteca y los módulos de marco seguirán ocultos de forma predeterminada.
Como resultado de este cambio, la biblioteca estándar ahora permite a los desarrolladores elegir entre tres comportamientos de advertencia de obsolescencia diferentes:
FutureWarning
: siempre se muestra por defecto, recomendado para las advertencias destinadas a los usuarios finales de la aplicación (por ejemplo, para los ajustes de configuración de la aplicación obsoletos).DeprecationWarning
: se muestra por defecto solo en__main__
y cuando se ejecutan pruebas, se recomienda para advertencias destinadas a ser vistas por otros desarrolladores de Python donde una actualización de la versión puede resultar en un cambio de comportamiento o un error.PendingDeprecationWarning
: se muestra de forma predeterminada solo cuando se ejecutan pruebas, diseñado para casos en los que una actualización de versión futura cambiará la categoría de advertencia aDeprecationWarning
oFutureWarning
.
Anteriormente ambos DeprecationWarning
y PendingDeprecationWarning
solo eran visibles cuando se ejecutaban pruebas, lo que significaba que los desarrolladores que escribían principalmente scripts de un solo archivo o usaban Python de forma interactiva podrían sorprenderse al ver cambios importantes en las API que usaban.
Ver también
- PEP 565 – Muestra DeprecationWarning en
__main__
PEP escrito y implementado por Nick Coghlan
PEP 560: Soporte básico para el módulo de typing
y tipos genéricos¶
Inicialmente PEP 484 fue diseñado de tal manera que no introduciría * ningún * cambio en el intérprete principal de CPython. Ahora escriba sugerencias y el módulo typing
son ampliamente utilizados por la comunidad, por lo que se elimina esta restricción. El PEP introduce dos métodos especiales __class_getitem__()
y __mro_entries__
, estos métodos ahora son utilizados por la mayoría de las clases y construcciones especiales en typing
. Como resultado, la velocidad de varias operaciones con tipos aumentó hasta 7 veces, los tipos genéricos se pueden usar sin conflictos de metaclase, y varios errores de larga data en el módulo typing
han sido arreglados.
Ver también
- PEP 560 – Soporte básico para el modulo de escritura y tipos genéricos
PEP escrito y implementado por Ivan Levkivskyi
PEP 552: Archivos .pyc basados en hash¶
Python ha verificado tradicionalmente la actualización de los archivos de caché de código de bytes (es decir, archivos .pyc
) comparando los metadatos de origen (marca de tiempo y tamaño de última modificación) con la fuente de metadatos guardados en el encabezado del archivo de caché cuando se generó. Si bien es efectivo, este método de invalidación tiene sus inconvenientes. Cuando las marcas de tiempo del sistema de archivos son demasiado burdas, Python puede perder las actualizaciones de origen, lo que genera confusión en el usuario. Además, tener una marca de tiempo en el archivo de caché es problemático para construir reproducibilidad y sistemas de construcción basados en contenido.
PEP 552 extendiendo el formato ppc para permitir que el hash del archivo de origen se utilice para invalidación en lugar de la marca de tiempo de origen. Estos archivos .pyc
se denominan “hash-based”. Por defecto, Python todavía usa la invalidación basada en la marca de tiempo y no genera archivos .pyc
basados en has de tiempos de ejecución. Los archivos .pyc
basados en hash se pueden generar con py_compile
o compileall
.
Archivos .pyc
basados en hash Vienen en dos variantes: marcada y no marcada. Python valida los archivos .pyc
basados en hash comprobados con los archivos de origen correspondientes en tiempo de ejecución, pero no lo hace para pycs basados en hash no verificados. Archivos .pyc
no comprobados son una optimización de rendimiento útil para entornos donde un sistema externo a Python (por ejemplo, el sistema de compilación) es responsable de mantener actualizados los archivos .pyc
.
Consultar Invalidación del código de bytes en caché para mas información.
Ver también
- PEP 552 – Pycs deterministas
PEP escrito y implementado por Benjamin Peterson
PEP 545: Traducciones de Documentaciones de Python¶
PEP 545 describe el proceso de creación y mantenimiento de traducciones de documentación de Python.
Tres nuevas traducciones han sido agregadas:
Japonés: https://docs.python.org/ja/
Francés: https://docs.python.org/fr/
Coreano: https://docs.python.org/ko/
Ver también
- PEP 545 – Traducciones de Documentación de Python
PEP escrito y implementado por Julien Palard, Inada Naoki y Victor Stinner.
Modo de desarrollo de Python (-X dev)¶
La nueva opción -X
dev
opción de línea de comando o la nueva variable de entorno PYTHONDEVMODE
se puede usar para habilitar Python Development Mode. Cuando está en modo de desarrollo, Python realiza comprobaciones de tiempo de ejecución adicionales que son demasiado caras para habilitarse de forma predeterminada. Ver Python Development Mode documentación para la descripción completa.
Otros cambios en el lenguaje¶
Una expresión
await
y compresiones que contienen una cláusulaasync for
eran ilegales en las expresiones en formatted string literals debido a un problema con la implementación. En Python 3.7 se eliminó esta restricción.Ahora se pueden pasar más de 255 argumentos a una función y una función ahora puede tener más de 255 parámetros. (Contribuido por Serhiy Storchaka en bpo-12844 y bpo-18896.)
bytes.fromhex()
ybytearray.fromhex()
ahora ignore todos los espacios en blanco ASCII, no solo los espacios. (Contribuido por Robert Xiao en bpo-28927.)str
,bytes
, ybytearray
adquirió soporte para el nuevo métodoisascii()
, que se puede usar para probar si una cadena o bytes contienen solo los caracteres ASCII. (Contribuido por INADA Naoki en bpo-32677.)ImportError
ahora muestra el nombre del módulo y la ruta del módulo__file__
cuando fallafrom … import …
. (Contribuido por Matthias Bussonnier en bpo-29546.)Ahora se admiten las importaciones circulares que involucran importaciones absolutas con un submódulo vinculado a un nombre. (Contribuido por Serhiy Storchaka en bpo-30024.)
object.__format__(x, ‘’)
ahora es equivalente astr(x)
antes queformat(str(self), ‘’)
. (Contribuido por Serhiy Storchaka en bpo-28974.)Para brindar un mejor soporte a la creación dinámica de seguimientos de pila, ahora se puede crear una instancia de
types.TracebackType
a partir del código Python, y el atributotb_next
en tracebacks ahora se puede escribir. (Contribución de Nathaniel J. Smith en bpo-30579).Al usar la
-m
switch,sys.path[0]
ahora se expande con entusiasmo a la ruta completa del directorio de inicio, en lugar de dejarse como el directorio vacío (que permite importaciones desde el directorio de trabajo * actual * en el momento en que ocurre una importación) (Contribuido por Nick Coghlan en bpo-33053.)La nueva opción
-X
importtime
o la variable de entornoPYTHONPROFILEIMPORTTIME
pueden usarse para mostrar el tiempo de cada importación de módulos. (Contribuido por Inada Naoki en bpo-31415.)
Nuevos módulos¶
contextvars¶
El nuevo módulo contextvars
y un conjunto de nuevas APIs C introducir soporte para variables de contexto. Las variables de contexto son conceptualmente similares a las variables locales del proceso. A diferencia de TLS, las variables de contexto admiten l código asincrónico correctamente.
Los módulos asyncio
y decimal
se han actualizado para utilizar y admitir variables de contexto listas para usar. En particular, el contexto decimal activo ahora se almacena en una variable de contexto, lo que permite que las operaciones decimales funcionen con el contexto correcto en código asincrónico.
Ver también
- PEP 567 – Variables de Contexto
PEP escrito y implementado por Yury Selivanov
dataclasses¶
El nuevo decorador dataclass()
proporciona una forma de declarar data classes. Una clase de datos describe sus atributos usando anotaciones de variables de clase. Su constructor y otros métodos mágicos, como __repr__()
, __eq__()
, y __hash__()
se generan automáticamente.
Ejemplo:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
Ver también
- PEP 557 – Clases de Datos
PEP escrito y implementado por Eric V. Smith
importlib.resources¶
El nuevo módulo importlib.resources
proporciona varias API nuevas y un nuevo ABC para acceder, abrir y leer resources dentro de los paquetes. Los recursos son similares a los archivos dentro de los paquetes, pero no necesitan ser archivos reales en el sistema de archivos físico. Los cargadores de módulos pueden proporcionar una función get_resource_reader()
que devuelve una instancia importlib.abc.ResourceReader
para admitir esta nueva API. Los cargadores de rutas de archivos integrados y los cargadores de archivos zip admiten esto.
Contribuido por Barry Warsaw y Brett Cannon en bpo-32248.
Ver también
importlib_resources: un backport de PyPI para versiones anteriores de Python.
Módulos mejorados¶
argparse¶
El nuevo método ArgumentParser.parse_intermixed_args()
permite permite entremezclar opciones y argumentos posicionales. (Contribuido por paul.j3 en bpo-14191.)
asyncio¶
El modulo asyncio
ha recibido muchas funciones nuevas, usabilidad y mejoras de rendimiento. Los cambios notables incluyen:
La nueva función provisional
asyncio.run()
se puede utilizar para ejecutar una corrutina desde código síncrono creando y destruyendo automáticamente el bucle de eventos. (Contribuido por Yury Selivanov en bpo-32314.)asyncio adquirió soporte para
contextvars
.loop.call_soon()
,loop.call_soon_threadsafe()
,loop.call_later()
,loop.call_at()
, yFuture.add_done_callback()
tener un nuevo parámetro opcional * de contexto * solo de palabras clave.Tasks
ahora rastrea su contexto automáticamente. Ver PEP 567 para mas detalles. (Contribuido por Yury Selivanov en bpo-32436.)La nueva función
asyncio.create_task`se ha agregado como un atajo a ``asyncio.get_event_loop().create_task()`()
. (Contribuido por Andrew Svetlov en bpo-32311.)El nuevo método
loop.start_tls()
puede ser usado para actualizar una conexión existente para TLS. (Contribuido por Yury Selivanov en bpo-23749.)El nuevo método
loop.sock_recv_into()
permite leer datos de un socket directamente en un búfer proporcionado, lo que permite reducir las copias de datos. (Contribuido por Antoine Pitrou en bpo-31819.)La nueva función
asyncio.current_task()
devuelve la instanciaTask
que se está ejecutando actualmente y la nueva funciónasyncio.all_tasks()
devuelve un conjunto de todas las instanciasTask
existentes en un bucle determinado. Los métodosTask.current_task()
yTask.all_tasks()
han quedado obsoletos. (Contribución de Andrew Svetlov en bpo-32250).La nueva clase provisional
BufferedProtocol
permite implementar protocolos de transmisión con control manual sobre el búfer de recepción. (Contribuido por Yury Selivanov en bpo-32251.)La nueva función
asyncio.get_running_loop()
devuelve el bucle que se está ejecutando actualmente, y genera unRuntimeError
si el bucle esta corriendo. Esto contrasta conasyncio.get_event_loop()
, que * creará * un nuevo bucle de eventos si no se está ejecutando ninguno. (Contribuido por Yury Selivanov en bpo-32269.)El nuevo método de rutina
StreamWriter.wait_closed()
permite esperar hasta que se cierre el escritor de secuencias. El nuevo métodoStreamWriter.is_closing()
puede ser usado para determinar si el escritor esta cerrando. (Contribuido por Andrew Svetlov en bpo-32391.)El nuevo método de rutina
loop.sock_sendfile()
permite enviar archivos usandoos.sendfile
cuando sea posible. (Contribuido por Andrew Svetlov en bpo-32410.)El nuevo método
Future.get_loop()
yTask.get_loop()
devuelve la instancia del bucle en el que se creó una tarea o un futuro.Server.get_loop()
permite hacer lo mismo para objetos deasyncio.Server
. (Contribuido por Yury Selivanov en bpo-32415 y Srinivas Reddy Thatiparthy en bpo-32418.)Ahora es posible controlar las instancias de
asyncio.Server
cuando comienzan. Anteriormente, el servidor comenzaba a funcionar inmediatamente cuando se creaba. El nuevo argumento de palabra clave start_serving paraloop.create_server()
yloop.create_unix_server()
, así comoServer.start_serving()
, yServer.serve_forever()
se puede usar para desacoplar la instanciación y el servicio de servidor. El nuevo métodoServer.is_serving()
devuelveTrue
si el servidor esta iniciando.Server
los objetos ahora son administradores de contexto asíncronos:srv = await loop.create_server(...) async with srv: # some code # En éste momento, srv está cerrado y ya no acepta conexiones
(Contribuido por Yury Selivanov en bpo-32662.)
Objetos de devolución de llamada devueltos por
loop.call_later()
conseguir el nuevo métodowhen()
que devuelve una marca de tiempo de devolución de llamada programada absoluta. (Contribuido por Andrew Svetlov en bpo-32741.)El método
loop.create_datagram_endpoint()
adquirió soporte para sockets UNIX.(Contribuido por Quentin Dawans en bpo-31245.)Los métodos
asyncio.open_connection()
,asyncio.start_server()
functions,loop.create_connection()
,loop.create_server()
,loop.create_accepted_socket() <asyncio.loop.connect_accepted_socket>`y sus correspondientes variantes de socket UNIX ahora aceptan el argumento de palabra clave *ssl_handshake_timeout*. (Contribuido por *Neil Aspinall* en :issue:`29970()
.)El nuevo método
Handle.cancelled()
devuelveTrue
si se canceló la devolución de llamada. (Contribuido por Marat Sharafutdinov en bpo-31943.)La fuente asyncio se ha convertido para utilizar la sintaxis
async
/await
. (Contribuido por Andrew Svetlov en bpo-32193.)El nuevo método
ReadTransport.is_reading()
puede ser usado para determinar el estado de lectura del transporte. Adicionalmente, las llamadas aReadTransport.resume_reading()
yReadTransport.pause_reading()
ahora son idempotentes. (Contribuido por Yury Selivanov en bpo-32356.)Los métodos de bucle que aceptan rutas de socket ahora admiten el paso objetos con forma de ruta. (Contribuido por Yury Selivanov en bpo-32066.)
En
asyncio
, los sockets TCP en Linux ahora son creados con el indicadorTCP_NODELAY
configurado por defecto. (Contribuido por Yury Selivanov y Victor Stinner en bpo-27456.)Las excepciones que ocurren en tareas canceladas ya no se registran. (Contribuido por Yury Selivanov en bpo-30508.)
Nuevas clases
WindowsSelectorEventLoopPolicy
yWindowsProactorEventLoopPolicy
. (Contribuido por Yury Selivanov en bpo-33792.)
Varias APIs asyncio
se han obsoleta.
binascii¶
La función b2a_uu()
ahora acepta un argumento de palabra clave opcional backtick. Cuando es cierto, los ceros están representados por ’`’
en lugar de espacios. (Contribuido por Xiang Zhang en bpo-30103.)
calendar¶
La clase (Contribuido por *Oz Tiram* en :issue:`30095
.)
collections¶
collections.namedtuple()
ahora soporta valores por defecto. (Contribuido por Raymond Hettinger en bpo-32320.)
compileall¶
compileall.compile_dir()
aprendió el nuevo parámetro invalidation_mode, que se puede utilizar para habilitar invalidación de .pyc basada en hash. El modo de invalidación también se puede especificar en la línea de comando usando el nuevo argumento —invalidation-mode
. (Contribuido por Benjamin Peterson en bpo-31650.)
concurrent.futures¶
ProcessPoolExecutor
y ThreadPoolExecutor
ahora soporta los nuevos argumentos de constructor initializer y initargs. (Contribuido por Antoine Pitrou en bpo-21423.)
La ProcessPoolExecutor
puede ahora tomar el contexto de multiprocesamiento a través del nuevo argumento mp_context. (Contribuido por Thomas Moreau en bpo-31540.)
contextlib¶
El nuevo nullcontext()
es un administrador de contexto sin operaciones simple y rápido que ExitStack
. (Contribuido por Jesse-Bakker en bpo-10049.)
Se han añadido los nuevos asynccontextmanager()
, AbstractAsyncContextManager
, y AsyncExitStack
para complementar sus partes sincronicas. (Contribuido por Jelle Zijlstra en bpo-29679 y bpo-30241, y por Alexander Mohr y Ilya Kulakov en bpo-29302.)
cProfile¶
La linea de comandos cProfile
ahora acepta -m module_name
como alternativa a la ruta del script. (Contribuido por Sanyam Khurana en bpo-21862.)
crypt¶
El módulo crypt
ahora admite el método de hash Blowfish. (Contribuido por Serhiy Storchaka en bpo-31664).
La función mksalt()
ahora permite especificar el número de rondas para el hash. (Contribución de Serhiy Storchaka en bpo-31702).
datetime¶
Los nuevos objetos datetime.fromisoformat()
un método constructor datetime
de una cadena en uno de los formatos de salida de datetime.isoformat()
. (Contribuido por Paul Ganssle en bpo-15873.)
La clase tzinfo
ahora admite compensaciones de subminutos. (Contribuido por Alexander Belopolsky en bpo-5288.)
dbm¶
dbm.dumb
ahora admite la lectura de archivos de solo lectura y ya no escribe el archivo de índice cuándo no se cambia.
decimal¶
El módulo decimal
ahora usa variables de contexto para almacenar el contexto decimal. (Contribuido por Yury Selivanov en bpo-32630.)
dis¶
La función dis()
ahora puede desensamblar objetos de código anidados (el código de comprensiones, expresiones generadoras y funciones anidadas, y el código utilizado para construir clases anidadas). La profundidad máxima de la recursividad de desmontaje se controla mediante el nuevo parámetro * profundidad . (Contribuido por *Serhiy Storchaka en bpo-11822.)
distutils¶
README.rst
ahora se incluye en la lista de READMEs estándar de distutils y, por lo tanto, se incluye en las distribuciones de código fuente. (Contribuido por Ryan Gonzalez en bpo-11913.)
enum¶
La Enum
aprendió la nueva propiedad de clase _ignore_
, que permite enumerar los nombres de propiedades que no deben convertirse en miembros de enumeración. (Contribuido por Ethan Furman en bpo-31801.)
En Python 3.8, intentar buscar objetos que no sean Enum en Enum
lanzará un TypeError
(por ejemplo, 1 in Color
); de manera similar, si se intenta buscar objetos que no sean Flag en un miembro Flag
se lanzará TypeError
(por ejemplo, 1 in Perm.RW
); actualmente, ambas operaciones devuelven False
en su lugar y están obsoletas.
functools¶
functools.singledispatch()
ahora admite el registro de implementaciones mediante anotaciones de tipo. (Contribuido por Łukasz Langa en bpo-32227.)
gc¶
La nueva función gc.freeze()
permite congelar todos los objetos rastreados por el recolector de basura y excluirlos de colecciones futuras. Esto se puede utilizar antes de llamar POSIX fork()
para hacer que la copia en escritura de GC sea amigable o para acelerar la recopilación. La nuevas funciones gc.unfreeze()
revierten esta operación. Además, gc.get_freeze_count()
se puede utilizar para obtener el número de objetos congelados. (Contribuido por Li Zekun en bpo-31558.)
hmac¶
El módulo hmac
ahora tiene una función one-shot optimizada digest()
, que es hasta tres veces más rápida que HMAC()
.
http.client¶
HTTPConnection
y HTTPSConnection
ahora admite el nuevo argumento * tamaño de bloque * para mejorar el rendimiento de carga. (Contribuido por Nir Soffer en bpo-31945.)
http.server¶
SimpleHTTPRequestHandler
ahora admite el encabezado HTTP If-Modified-Since
. El servidor devuelve el estado de respuesta 304 si el archivo de destino no se modificó después del tiempo especificado en el encabezado. (Contribuido por Pierre Quentel en bpo-29654.)
SimpleHTTPRequestHandler
acepta el nuevo argumento directorio, además del nuevo argumento de línea de comando —directory
. Con este parámetro, el servidor sirve el directorio especificado, por defecto usa el directorio de trabajo actual. (Contribuido por Stéphane Wirtel y Julien Palard en bpo-28707.)
La nueva clase ThreadingHTTPServer
usa procesos para manejar solicitudes usando ThreadingMixin
. Se usa cuando se ejecuta http.server
con -m
. (Contribuido por Julien Palard en bpo-31639.)
idlelib and IDLE¶
Varias correcciones para autocompletar. (Contribuido por Louie Lu en bpo-15786.)
El Explorador de módulos (en el menú Archivo, antes llamado Explorador de clases), ahora muestra funciones y clases anidadas además de funciones y clases de nivel superior. (Contribuido por Guilherme Polo, Cheryl Sabella, y Terry Jan Reedy en bpo-1612262.)
El cuadro de diálogo Configuración (Opciones, Configurar IDLE) se ha reescrito parcialmente para mejorar tanto la apariencia como la función. (Contribuido por Cheryl Sabella y Terry Jan Reedy en múltiple issues.)
La muestra de fuente ahora incluye una selección de caracteres no latinos para que los usuarios puedan ver mejor el efecto de seleccionar una fuente en particular. (Contribuido por Terry Jan Reedy en bpo-13802.). La muestra se puede editar para incluir otros caracteres. (Contribuido por Serhiy Storchaka en bpo-31860.)
Las funciones IDLE implementadas anteriormente como extensiones se han vuelto a implementar como funciones normales. Su configuración se ha movido de la pestaña Extensiones a otras pestañas de diálogo. (Contribuido por Charles Wohlganger y Terry Jan Reedy en bpo-27099.)
Se revisó la opción de contexto del código del editor. El cuadro muestra todas las líneas de contexto hasta las líneas máximas. Al hacer clic en una línea de contexto, el editor pasa a esa línea. Los colores de contexto para temas personalizados se agregan a la pestaña Destacados del cuadro de diálogo Configuración. (Contribuido por Cheryl Sabella y Terry Jan Reedy en bpo-33642, bpo-33768, y bpo-33679.)
En Windows, una nueva llamada a la API le dice a Windows que tk escala para DPI. En Windows 8.1+ o 10, con las propiedades de compatibilidad de DPI del binario de Python sin cambios y una resolución de monitor superior a 96 DPI, esto debería hacer que el texto y las líneas sean más nítidos. De lo contrario, no debería tener ningún efecto. (Contribuido por Terry Jan Reedy en bpo-33656.)
Nuevo en 3.7.1:
La salida sobre N líneas (50 por defecto) se reduce a un botón. N se puede cambiar en la sección PyShell de la página General del cuadro de diálogo Configuración. Se pueden comprimir menos líneas, pero posiblemente más largas, haciendo clic derecho en la salida. La salida comprimida se puede expandir en su lugar haciendo doble clic en el botón o en el portapapeles o en una ventana separada haciendo clic derecho en el botón. (Contribuido por Tal Einat en bpo-1529353.)
Los cambios anteriores se han actualizado a las versiones de mantenimiento 3.6.
Nuevo en 3.7.4:
Agregado “Run Customized” al menú Correr para ejecutar un módulo con configuraciones personalizadas. Cualquier argumento de línea de comando ingresado se agrega a sys.argv. Vuelven a aparecer en el cuadro para la siguiente ejecución personalizada. También se puede suprimir el reinicio normal del módulo principal de Shell. (Contribuidor por Cheryl Sabella, Terry Jan Reedy, y otros en bpo-5680 y bpo-37627.)
Nuevo en 3.7.5:
Agregue números de línea opcionales para las ventanas del editor IDLE. Las ventanas se abren sin números de línea a menos que se establezca lo contrario en la pestaña General del cuadro de diálogo de configuración. Los números de línea de una ventana existente se muestran y ocultan en el menú Opciones. (Contribuido por Tal Einat y Saimadhav Heblikar en bpo-17535.)
importlib¶
El importlib.abc.ResourceReader
ABC se introdujo para admitir la carga de recursos desde paquetes. Ver también importlib.resources. (Contribuido por Barry Warsaw, Brett Cannon en bpo-32248.)
importlib.reload()
ahora mejora ModuleNotFoundError
si el módulo carece de especificación. (Contribuido por Garvit Khatri en bpo-29851.)
importlib.find_spec()
ahora mejora ModuleNotFoundError
en lugar de AttributeError
si el modulo principal especifico no ese un paquete (es decir, carece de un atributo __path__
). (Contribuido por Milan Oberkirch en bpo-30436.)
La nueva importlib.source_hash()
se puede utilizar para calcular el hash de la fuente pasada. Un archivo .pyc basado en hash incrusta el valor devuelto por esta función.
io¶
El nuevo método TextIOWrapper.reconfigure()
se puede utilizar para reconfigurar el flujo de texto con la nueva configuración. (Contribuido por Antoine Pitrou en bpo-30526 y INADA Naoki en bpo-15216.)
ipaddress¶
Los nuevos métodos subnet_of()
y supernet_of()
de ipaddress.IPv6Network
y ipaddress.IPv4Network
pueden ser usados para pruebas de contención de redes. (Contribuido por Michel Albert y Cheryl Sabella en bpo-20825.)
itertools¶
itertools.islice()
ahora acepta integer-like objects
como argumentos de inicio, parada y corte. (Contribuido por Will Roberts en bpo-30537.)
locale¶
El nuevo argumento * monetario * para locale.format_string()
se puede utilizar para hacer que la conversión utilice separadores de miles monetarios y cadenas de agrupación. (Contribuido por Garvit en bpo-10379.)
La función locale.getpreferredencoding()
ahora siempre devuelve ’UTF-8’
en Android o cuando está en el modo UTF-8 forzado.
logging¶
Logger
instancias ahora pueden ser decapadas. (Contribuido por Vinay Sajip en bpo-30520.)
El nuevo método StreamHandler.setStream()
se puede utilizar para reemplazar la secuencia del registrador después de la creación del controlador. (Contribuido por Vinay Sajip en bpo-30522.)
Ahora es posible especificar argumentos de palabras clave para los constructores de manejadores en la configuración pasada a logging.config.fileConfig()
. (Contribuido por Preston Landers en bpo-31080.)
math¶
La nueva función math.remainder()
implementa la operación de resto de estilo IEEE 754. (Contribuido por Mark Dickinson en bpo-29962.)
mimetypes¶
El tipo MIME de .bmp se ha cambiado de ’image/x-ms-bmp’
a ’image/bmp’
. (Contribuido por Nitish Chandra en bpo-22589.)
msilib¶
El nuevo método Database.Close()
se puede utilizar para cerrar la base de datos MSI. (Contribuido por Berker Peksag en bpo-20486).
multiprocessing¶
El nuevo método Process.close()
cierra explícitamente el objeto de proceso y libera todos los recursos asociados con él. ValueError
se genera si el proceso subyacente aún se está ejecutando. (Contribuido por Antoine Pitrou en bpo-30596.)
El nuevo método Process.kill()
se puede usar para terminar el proceso usando la señal SIGKILL
en Unix. (Contribuido por Vitor Pereira en bpo-30794.)
Subprocesos no demoníacos creados por Process
ahora se unen al salir del proceso. (Contribuido por Antoine Pitrou en bpo-18966.)
os¶
os.fwalk()
ahora acepta el argumento path como bytes
. (Contribuido por Serhiy Storchaka en bpo-28682.)
os.scandir()
obtuvo soporte de descriptores de archivo. (Contribuido por Serhiy Storchaka en bpo-25996.)
La nueva función register_at_fork()
permite registrar devoluciones de llamada de Python para que se ejecuten en la bifurcación del proceso. (Contribuido por Antoine Pitrou en bpo-16500.)
Agrega funciones os.preadv()
(combinando la funcionalidad de os.readv()
y os.pread()
) y os.pwritev()
(combinando la funcionalidad de os.writev()
y os.pwrite()
). (Contribuido por Pablo Galindo en bpo-31368.)
El argumento de modo de os.makedirs()
ya no afecta los bits de permiso de archivo de los directorios de nivel intermedio recién creados. (Aportado por Serhiy Storchaka en bpo-19930.)
os.dup2()
ahora retorna el nuevo descriptor de archivo. Previamente, None
siempre fue retornado. (Contribuido por Benjamin Peterson en bpo-32441.)
La estructura retornada por os.stat()
ahora contiene el atributo st_fstype
en Solaris y sus derivados. (Contribuido por Jesús Cea Avión en bpo-32659.)
pathlib¶
El nuevo método Path.is_mount()
ahora está disponible en los sistemas POSIX y se puede utilizar para determinar si una ruta es un punto de montaje. (Contribuido por Cooper Ry Lees en bpo-30897.)
pdb¶
pdb.set_trace()
ahora toma un argumento opcional header solo de palabra clave. Si se proporciona, se imprime en la consola justo antes de que comience la depuración. (Contribuido por Barry Warsaw en bpo-31389.)
pdb
la línea de comando ahora acepta -m module_name
como una alternativa al archivo de script. (Contribuido por Mario Corchero en bpo-32206.)
py_compile¶
py_compile.compile()
— y por extensión, compileall
— ahora respeta la variable de entorno SOURCE_DATE_EPOCH
creando incondicionalmente archivos .pyc
para la validación basada en hash. Esto permite garantizar compilaciones reproducibles de archivos .pyc
cuando se crean con entusiasmo. (Contribuido por Bernhard M. Wiedemann en bpo-29708.)
pydoc¶
El servidor pydoc ahora puede vincularse a un nombre de host arbitrario especificado por el nuevo argumento de línea de comandos -n
. (Contribuido por Feanil Patel en bpo-31128.)
queue¶
La nueva clase SimpleQueue
es una cola ilimitada FIFO. (Contribuido por Antoine Pitrou en bpo-14976.)
re¶
Las banderas re.ASCII
, re.LOCALE
y re.UNICODE
se pueden establecer dentro del alcance de un grupo. (Contribuido por Serhiy Storchaka en bpo-31690.)
re.split()
ahora admite la división en un patrón como r’\b’
, ’^$’
or (?=-)
que coincide con una cadena vacía. (Contribuido por Serhiy Storchaka en bpo-25054.)
Las expresiones regulares compiladas con el indicador re.LOCALE
ya no dependen de la configuración regional en el momento de la compilación. La configuración regional se aplica solo cuando se utiliza la expresión regular compilada. (Contribuido por Serhiy Storchaka en bpo-30215.)
FutureWarning
ahora se emite si una expresión regular contiene construcciones de conjuntos de caracteres que cambiarán semánticamente en el futuro, como conjuntos anidados y operaciones de conjuntos. (Contribuido por Serhiy Storchaka en bpo-30349.)
Las expresiones regulares compiladas y los objetos coincidentes ahora se pueden copiar usando copy.copy()
y copy.deepcopy()
. (Contribuido por Serhiy Storchaka en bpo-10076.)
signal¶
El nuevo argumento * warn_on_full_buffer * para la función signal.set_wakeup_fd()
permite especificar si Python imprime una advertencia en stderr cuando el búfer de activación se desborda. (Contribuido por Nathaniel J. Smith en bpo-30050.)
socket¶
El nuevo método socket.getblocking()
retorna True
si el socket esta en modo bloqueo y False
en caso contrario. (Contribuido por Yury Selivanov en bpo-32373.)
La nueva función socket.close()
cierra el descriptor de archivo de socket pasado. Esta función debe usarse en lugar de os.close()
para una mejor compatibilidad entre plataformas. (Contribuido por Christian Heimes en bpo-32454.)
El módulo socket
ahora expone las constantes socket.TCP_CONGESTION
(Linux 2.6.13), socket.TCP_USER_TIMEOUT
(Linux 2.6.37) y socket.TCP_NOTSENT_LOWAT
(Linux 3.12). (Contribuido por Omar Sandoval en bpo-26273 y Nathaniel J. Smith en bpo-29728).
Se agregó compatibilidad con sockets socket.AF_VSOCK
para permitir la comunicación entre máquinas virtuales y sus hosts. (Contribución de Cathy Avery en bpo-27584).
Los sockets ahora detectan automáticamente la familia, el tipo y el protocolo del descriptor de archivo de forma predeterminada. (Contribuido por Christian Heimes en bpo-28134.)
socketserver¶
socketserver.ThreadingMixIn.server_close()
ahora espera hasta que se completen todos los subprocesos que no son demonios. socketserver.ForkingMixIn.server_close()
ahora espera hasta que se completen todos los procesos secundarios.
Agregue un nuevo atributo de clase socketserver.ForkingMixIn.block_on_close
a las clases socketserver.ForkingMixIn
y socketserver.ThreadingMixIn
. Establece el atributo de clase en False
para obtener el comportamiento anterior a 3.7.
sqlite3¶
sqlite3.Connection
ahora expone el método backup()
cuando la biblioteca SQLite subyacente está en la versión 3.6.11 o superior. (Contribuido por Lele Gaifax en bpo-27645.)
El argumento * base de datos * de sqlite3.connect()
ahora acepta cualquier path-like object, en lugar de solo una cadena. (Contribuido por Anders Lorentsen en bpo-31843.)
ssl¶
El módulo ssl
ahora usa la API integrada de OpenSSL en lugar de match_hostname()
para comprobar un nombre de host o una dirección IP. Los valores se validan durante el protocolo de enlace TLS. Cualquier error de validación de certificado, incluida la falla en la verificación del nombre de host, ahora aumenta SSLCertVerificationError
y aborta el protocolo de enlace con un mensaje de alerta TLS adecuado. La nueva excepción contiene información adicional. La validación del nombre de host se puede personalizar con SSLContext.hostname_checks_common_name
. (Contribuido por Christian Heimes en bpo-31399.)
Nota
La verificación mejorada del nombre de host requiere una implementación libssl compatible con OpenSSL 1.0.2 o 1.1. En consecuencia, OpenSSL 0.9.8 y 1.0.1 ya no son compatibles (consulte Eliminación de soporte de plataforma para más detalles). El módulo ssl es principalmente compatible con LibreSSL 2.7.2 y versiones posteriores.
El módulo ssl
ya no envía direcciones IP en la extensión SNI TLS. (Contribuido por Christian Heimes en bpo-32185.)
match_hostname()
ya no admite comodines parciales como www*.example.org
. (Contribuido por Mandeep Singh en bpo-23033 y Christian Heimes en bpo-31399.)
La selección del conjunto de cifrado predeterminado del módulo ssl
ahora usa un enfoque de lista negra en lugar de una lista blanca codificada. Python ya no vuelve a habilitar los cifrados que han sido bloqueados por las actualizaciones de seguridad de OpenSSL. La selección del conjunto de cifrado predeterminado se puede configurar en tiempo de compilación. (Contribuido por Christian Heimes en bpo-31429.)
Ahora se admite la validación de certificados de servidor que contienen nombres de dominio internacionalizados (IDN). Como parte de este cambio, el atributo SSLSocket.server_hostname
ahora almacena el nombre de host esperado en forma de etiqueta A (”xn--pythn-mua.org”
), en lugar de la forma de etiqueta U (”pythön.org”
). (Contribuido por Nathaniel J. Smith y Christian Heimes en bpo-28414.)
El módulo ssl
tiene soporte preliminar y experimental para TLS 1.3 y OpenSSL 1.1.1. En el momento del lanzamiento de Python 3.7.0, OpenSSL 1.1.1 todavía está en desarrollo y TLS 1.3 aún no se ha finalizado. El protocolo y el protocolo de enlace TLS 1.3 se comportan de forma ligeramente diferente a TLS 1.2 y versiones anteriores, consulte TLS 1.3. (Contribuido por Christian Heimes en bpo-32947, bpo-20995, bpo-29136, bpo-30622 y bpo-33618)
SSLSocket
y SSLObject
ya no tiene un constructor público. La creación de instancias directa nunca fue una característica documentada y compatible. Las instancias deben crearse con métodos SSLContext
wrap_socket()
y wrap_bio()
. (Contribuido por Christian Heimes en bpo-32951)
Las API de OpenSSL 1.1 para configurar la versión mínima y máxima del protocolo TLS están disponibles como SSLContext.minimum_version
y SSLContext.maximum_version
. Los protocolos admitidos se indican mediante varios indicadores nuevos, como HAS_TLSv1_1
. (Contribuido por Christian Heimes en bpo-32609.)
Se agregó ssl.SSLContext.post_handshake_auth
para habilitar y ssl.SSLSocket.verify_client_post_handshake()
para iniciar la autenticación posterior al protocolo de enlace TLS 1.3. (Contribuido por Christian Heimes en gh-78851.)
string¶
string.Template
ahora le permite modificar opcionalmente el patrón de expresión regular para marcadores de posición reforzados y marcadores de posición no reforzados por separado. (Contribuido por Barry Warsaw en bpo-1198569.)
subprocess¶
La función subprocess.run()
acepta el nuevo argumento de palabra clave capture_output. Cuando es verdadero, se capturarán stdout y stderr. Esto es equivalente a pasar subprocess.PIPE
como argumentos stdout y stderr. (Contribuido por Bo Bayles en bpo-32102).
La función subprocess.run
y el constructor subprocess.Popen
ahora aceptan la palabra clave del argumento text como un alias para universal_newlines. (Contribuido por Andrew Clegg en bpo-31756.)
En Windows, el valor predeterminado de close_fds se cambió de False
a True
al redirigir los identificadores estándar. Ahora es posible establecer close_fds en verdadero al redirigir los identificadores estándar. Ver subprocess.Popen
. Esto significa que close_fds ahora tiene el valor predeterminado de True
en todas las plataformas compatibles. (Contribuido por Segev Finer en bpo-19764.)
El módulo de subproceso ahora es más elegante al manejar KeyboardInterrupt
durante: subprocess.call()
, subprocess.run()
, o en un administrador de contexto Popen
. Ahora espera un corto período de tiempo para que el niño salga, antes de continuar con el manejo de la excepción KeyboardInterrupt
. (Contribuido por Gregory P. Smith en bpo-25942.)
sys¶
La nueva función de enganche sys.breakpointhook()
es llamada por la incorporada breakpoint()
. (Contribuido por Barry Warsaw en bpo-31353.)
En Android, la nueva sys.getandroidapilevel()
devuelve la versión de la API de Android en tiempo de compilación. (Contribuido por Victor Stinner en bpo-28740.)
La nueva función sys.get_coroutine_origin_tracking_depth()
devuelve la profundidad de seguimiento del origen de la corrutina actual, según lo establecido por el nuevo sys.set_coroutine_origin_tracking_depth()
. asyncio
se ha convertido para usar esta nueva API en lugar de la obsoleta sys.set_coroutine_wrapper()
. (Contribuido por Nathaniel J. Smith en bpo-32591.)
time¶
PEP 564 añade seis nuevas funciones con resolución de nanosegundos al modulo time
:
Se han agregado nuevos identificadores de reloj:
time.CLOCK_BOOTTIME
(Linux): idéntico atime.CLOCK_MONOTONIC
, excepto que también incluye cualquier momento en que el sistema esté suspendido.time.CLOCK_PROF
(FreeBSD, NetBSD y OpenBSD): Temporizador de CPU por proceso de alta resolución.time.CLOCK_UPTIME
(FreeBSD, OpenBSD): Tiempo cuyo valor absoluto es el tiempo que el sistema ha estado funcionando y no suspendido, proporcionando una medición precisa del tiempo de actividad.
La nuevas funciones time.thread_time()
y time.thread_time_ns()
se puede utilizar para obtener medidas de tiempo de CPU por subproceso. (Contribuido por Antoine Pitrou en bpo-32025.)
La nueva función time.pthread_getcpuclockid()
devuelve el ID de reloj del reloj de tiempo de CPU específico del subproceso.
tkinter¶
La nueva clase tkinter.ttk.Spinbox
esta disponible ahora. (Contribuido por Alan Moore en bpo-32585.)
tracemalloc¶
tracemalloc.Traceback
se comporta más como rastreos regulares, ordenando los fotogramas del más antiguo al más reciente. Traceback.format()
ahora acepta límite negativo, truncando el resultado a los marcos más antiguos de abs(limit)
. Para obtener el comportamiento anterior, use el nuevo argumento most_recent_first para Traceback.format()
. (Contribuido por Jesse Bakker en bpo-32121.)
types¶
Las nuevas clases WrapperDescriptorType
, MethodWrapperType
, MethodDescriptorType
, y ClassMethodDescriptorType
ahora están disponibles. (Contribuido por Manuel Krebber y Guido van Rossum en bpo-29377, y Serhiy Storchaka en bpo-32265.)
La nueva función types.resolve_bases()
resuelve las entradas MRO dinámicamente según lo especificado por PEP 560. (Contribuido por Ivan Levkivskyi en bpo-32717.)
unicodedata¶
La base de datos interna unicodedata
se actualizó para usar Unicode 11. (Aportado por Benjamín Peterson.)
unittest¶
La nueva opción de la linea de comandos -k
permite filtrar pruebas por una subcadena de nombre o un patrón similar a un shell de Unix. Por ejemplo, python -m unittest -k foo
ejecuta foo_tests.SomeTest.test_something
, bar_tests.SomeTest.test_foo
, pero no bar_tests.FooTest.test_something
. (Contribuido por Jonas Haag en bpo-32071.)
unittest.mock¶
Los atributos sentinel
ahora preservan su identidad cuando están copied
o pickled
. (Contribuido por Serhiy Storchaka en bpo-20804.)
La nueva función seal()
permite sellar instancias Mock
, que no permitirá la creación de simulacros de atributos. El sello se aplica de forma recursiva a todos los atributos que en sí mismos son burlas. (Contribuido por Mario Corchero en bpo-30541.)
urllib.parse¶
urllib.parse.quote()
ha sido actualizada desde RFC 2396 a RFC 3986, agregado ~
para el conjunto de caracteres que nunca se cotizan por defecto. (Contribuido por Christian Theune y Ratnadeep Debnath en bpo-16285.)
uu¶
La función uu.encode()
ahora acepta un argumento de palabra clave backtick opcional. Cuando es verdadero, los ceros se representan con '`'
en lugar de espacios. (Contribuido por Xiang Zhang en bpo-30103).
uuid¶
El nuevo atributo UUID.is_safe
transmite información de la plataforma sobre si los UUID generados se generan con un método seguro para multiprocesamiento. (Contribuido por Barry Warsaw en bpo-22807.)
uuid.getnode()
ahora prefiere las direcciones MAC administradas universalmente a las direcciones MAC administradas localmente. Esto ofrece una mejor garantía de la unicidad global de los UUID devueltos desde uuid.uuid1()
. Si solo hay disponibles direcciones MAC administradas localmente, se devuelve la primera que se encuentre. (Contribuido por Barry Warsaw en bpo-32107.)
warnings¶
La inicialización de los filtros de advertencias predeterminados ha cambiado de la siguiente manera:
advertencias habilitadas a través de opciones de línea de comando (incluidos los de
-b
y la nueva opción específica de CPython-X
dev
) siempre se pasan a la maquinaria de advertencias a través del atributosys.warnoptions
.los filtros de advertencias habilitados a través de la línea de comandos o el entorno ahora tienen el siguiente orden de prioridad:
el filtro
BytesWarning
para-b
(o-bb
)cualquier filtro especificado con la opción
-W
cualquier filtro especificado con la variable de entorno
PYTHONWARNINGS
cualquier otro filtro específico de CPython (por ejemplo, el filtro
default
agregado para el nuevo modo-X dev
)cualquier filtro implícito definido directamente por la maquinaria de advertencias
en las compilaciones de depuración de CPython, ahora todas las advertencias se muestran de forma predeterminada (la lista de filtros implícitos está vacía)
(Contribuido por Nick Coghlan y Victor Stinner en bpo-20361, bpo-32043, and bpo-32230.)
Las advertencias de obsolescencia se muestran una vez más de forma predeterminada en scripts de un solo archivo y en el indicador interactivo. Consultar PEP 565: Mostrar DeprecationWarning en __main__ para mas detalles. (Contribuido por Nick Coghlan en bpo-31975.)
xml¶
Como medida de mitigación frente a la recuperación de DTD y entidades externas, los módulos xml.dom.minidom
y xml.sax
ya no procesan entidades externas de forma predeterminada. (Contribuido por Christian Heimes en gh-61441.)
xml.etree¶
ElementPath predicados en los métodos find()
ahora pueden comparar el texto del nodo actual con `[. = “text”]
, no solo texto en niños. Los predicados también permiten agregar espacios para una mejor legibilidad. (Contribuido por Stefan Behnel en bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function
ahora puede ser usado como un decorador. (Contribuido por Xiang Zhang en bpo-7769.)
zipapp¶
Función create_archive()
ahora acepta un argumento opcional filter para permitir al usuario seleccionar que archivos deben incluirse en el
Función create_archive()
ahora acepta un argumento opcional * comprimido * para generar un archivo comprimido. También se ha agregado una opción de línea de comando —compress
para admitir la compresión. (Contribuido por Zhiming Wang en bpo-31638.)
zipfile¶
ZipFile
ahora acepta el nuevo parámetro compresslevel para controlar el nivel de compresión. (Contribuido por Bo Bayles en bpo-21417.)
Subdirectorios en archivos creados por ZipFile
ahora son guardados en orden alfabético. (Contribuido por Bernhard M. Wiedemann en bpo-30693.)
Cambios en la API C¶
Se implementó una nueva API para el almacenamiento local de subprocesos. Ver PEP 539: Nueva API C para almacenamiento local de subprocesos para una descripción general y API de almacenamiento específico de hilo (TSS, Thread Specific Storage) para una referencia completa. (Contribuido por Masayuki Yamamoto en bpo-25658.)
La nueva funcionalidad variables de contexto expone un numero de nuevas APIs C.
La nueva función PyImport_GetModule()
devuelve el módulo previamente importado con el nombre dado. (Contribuido por Eric Snow en bpo-28411.)
El nuevo macro Py_RETURN_RICHCOMPARE
facilita la escritura de funciones de comparación enriquecidas. (Contribuido por Petr Victorin en bpo-23699.)
El nuevo macro Py_UNREACHABLE
se puede utilizar para marcar rutas de código inalcanzables. (Contribuido por Barry Warsaw en bpo-31338.)
El tracemalloc
ahora expone una API C a través de las nuevas funciones PyTraceMalloc_Track()
y PyTraceMalloc_Untrack()
. (Contribuido por Victor Stinner en bpo-30054.)
Los nuevos marcadores estáticos import__find__load__start()
y import__find__load__done()
se pueden usar para rastrear las importaciones de módulos. (Contribuido por Christian Heimes en bpo-31574.)
Los campos name
y doc
de las estructuras PyMemberDef
, PyGetSetDef
, PyStructSequence_Field
, PyStructSequence_Desc
y wrapperbase
ahora son del tipo const char *
en lugar de char *
. (Contribuido por Serhiy Storchaka en bpo-28761.)
El resultado de PyUnicode_AsUTF8AndSize()
y PyUnicode_AsUTF8()
es ahora de tipo const char *
en lugar de char *
. (Contribuido por Serhiy Storchaka en bpo-28769.)
El resultado de PyMapping_Keys()
, PyMapping_Values()
y PyMapping_Items()
ahora es siempre una lista, en lugar de una lista o una tupla. (Contribuido por Oren Milman en bpo-28280.)
Funciones agregadas PySlice_Unpack()
y PySlice_AdjustIndices()
. (Contribuido por Serhiy Storchaka en bpo-27867.)
PyOS_AfterFork()
está en desuso en favor de las nuevas funciones PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
y PyOS_AfterFork_Child()
. (Contribuido por Antoine Pitrou en bpo-16500.)
El único PyExc_RecursionErrorInst
que formaba parte de la API pública se ha eliminado ya que sus miembros nunca borrados pueden causar un error de segmentación durante la finalización del intérprete. Contribuido por Xavier de Gaye en bpo-22898 y bpo-30697.
Se agregó compatibilidad con C API para zonas horarias con constructores de zonas horarias PyTimeZone_FromOffset()
and PyTimeZone_FromOffsetAndName()
, y acceso único al UTC con PyDateTime_TimeZone_UTC
. Contribuido por Paul Ganssle en bpo-10381.
El tipo de resultados de PyThread_start_new_thread()
y PyThread_get_thread_ident()
, y el parámetro id de PyThreadState_SetAsyncExc()
cambió de long a unsigned long. (Aportado por Serhiy Storchaka en bpo-6532.)
PyUnicode_AsWideCharString()
ahora genera un ValueError
si el segundo argumento es NULL
y la cadena wchar_t* contiene caracteres nulos. (Aportado por Serhiy Storchaka en bpo-30708.)
Los cambios en la secuencia de inicio y la gestión de los asignadores de memoria dinámica significan que el requisito documentado durante mucho tiempo de llamar Py_Initialize()
antes de llamar a la mayoría de las funciones de la API de C, ahora se confía más en él, y no cumplirlo puede provocar errores de segmentación en las aplicaciones integradas. Ver la sección Portando a Python 3.7 en este documento y en la sección Antes de la inicialización de Python en la documentación de la API de C para obtener más detalles.
El nuevo: c: func PyInterpreterState_GetID()
devuelve él ID único para un intérprete dado. (Contribuido por Eric Snow en bpo-29102.)
Py_DecodeLocale()
, Py_EncodeLocale()
ahora usa la codificación UTF-8 cuando el modo UTF-8 esta habilitado. (Contribuido por Victor Stinner en bpo-29240.)
PyUnicode_DecodeLocaleAndSize()
y PyUnicode_EncodeLocale()
ahora usan la codificación local actual para el controlador de errores surrogateescape
. (Contribuido por Victor Stinner en bpo-29240.)
Los parámetros start y end de PyUnicode_FindChar()
ahora se ajustan para comportarse como cortes de cuerda. (Contribuido por Xiang Zhang en bpo-28822.)
Construir cambios¶
Se ha eliminado el soporte para construir —without-threads
. El módulo threading
ahora está siempre disponible. (Contribuido por Antoine Pitrou en bpo-31370.).
Ya no se incluye una copia completa de libffi para su uso al compilar el módulo _ctypes
en plataformas que no son OSX UNIX. Ahora se requiere una copia instalada de libffi al construir _ctypes
en tales plataformas. (Contribuido por Zachary Ware en bpo-27979.)
El proceso de compilación de Windows ya no depende de una sub versión para extraer fuentes externas; en su lugar, se usa un script de Python para descargar archivos zip desde GitHub. Si no se encuentra Python 3.6 en el sistema (a través de py -3.6
), NuGet se usa para descargar una copia de Python de 32 bits para este propósito. (Contribuido por Zachary Ware en bpo-30450.)
El módulo ssl
requiere libssl compatible con OpenSSL 1.0.2 o 1.1. OpenSSL 1.0.1 llegó al final de su vida útil el 31 de diciembre de 2016 y ya no es compatible. LibreSSL tampoco es compatible temporalmente. Las versiones de LibreSSL hasta la versión 2.6.4 carecen de las API de OpenSSL 1.0.2 necesarias.
Optimizaciones¶
La sobrecarga de llamar a muchos métodos de varias clases de biblioteca estándar implementadas en C se ha reducido significativamente al portar más código para usar la convención METH_FASTCALL
. (Contribuido por Victor Stinner en bpo-29300, bpo-29507, bpo-29452, y bpo-29286.)
Varias optimizaciones han reducido el tiempo de inicio de Python en un 10% en Linux y hasta en un 30% en macOS. (Contribuido por Victor Stinner, INADA Naoki en bpo-29585, y Ivan Levkivskyi en bpo-31333.)
Las llamadas a métodos ahora son hasta un 20% más rápidas debido a los cambios de código de bytes que evitan la creación de instancias de métodos enlazados. (Contribuidos por Yury Selivanov y INADA Naoki en bpo-26110.)
El módulo asyncio
recibió una serie de optimizaciones notables para funciones de uso común:
La función
asyncio.get_event_loop()
se ha vuelto a implementar en C para hacerlo hasta 15 veces más rápido. (Contribuido por Yury Selivanov en bpo-32296.)Se ha optimizado la gestión de devolución de llamada
asyncio.Future
. (Contribuido por Yury Selivanov en bpo-32348.)asyncio.gather()
ahora es hasta un 15% más rápido. (Contribuido por Yury Selivanov en bpo-32355.)asyncio.sleep()
ahora es hasta 2 veces más rápido cuando el argumento delay es cero o negativo. (Contribuido por Andrew Svetlov en bpo-32351.)Se ha reducido la sobrecarga de rendimiento del modo de depuración asyncio. (Contribuido por Antoine Pitrou en bpo-31970.)
Como resultado de PEP 560 trabajo, el tiempo de importación de typing
se ha reducido en un factor de 7, y muchas operaciones de mecanografía ahora son más rápidas. (Contribuido por Ivan Levkivskyi en bpo-32226.)
sorted()
y list.sort()
se han optimizado para que los casos comunes sean hasta un 40-75% más rápidos. (Contribuido por Elliot Gorokhovsky en bpo-28685.)
dict.copy()
es ahora 5.5 veces más rápido. (Contribuido por Yury Selivanov en bpo-31179.)
hasattr()
y getattr()
ahora son aproximadamente 4 veces más rápidos cuando name no se encuentra y obj no se anula object.__getattr__()
o object.__getattribute__()
. (Contribuido por INADA Naoki en bpo-32544.)
La búsqueda de ciertos caracteres Unicode (como la mayúscula ucraniana “Є”) en una cadena fue hasta 25 veces más lenta que la búsqueda de otros caracteres. Ahora es solo 3 veces más lento en el peor de los casos. (Contribuido por Serhiy Storchaka en bpo-24821.)
La fábrica collections.namedtuple()
ha sido re-implementada para hacer que la creación de tuplas con nombre sea de 4 a 6 veces más rápida. (Contribuido por Jelle Zijlstra con nuevas mejoras de INADA Naoki, Serhiy Storchaka, y Raymond Hettinger en bpo-28638.)
date.fromordinal()
y date.fromtimestamp()
ahora son hasta un 30% más rápidos en el caso común. (Contribuido por Paul Ganssle en bpo-32403.)
La función os.fwalk()
es ahora 2 veces mas rápida gracias al uso de os.scandir()
. (Contribuido por Serhiy Storchaka en bpo-25996.)
La rapidez de la función shutil.rmtree()
se ha mejorado en un 20-40% gracias al uso de la función os.scandir()
. (Contribuido por Serhiy Storchaka en bpo-28564.)
Búsqueda y coincidencia optimizadas que no distinguen entre mayúsculas y minúsculas de expresiones regulares
. La búsqueda de algunos patrones ahora puede ser hasta 20 veces más rápida. (Contribuido por Serhiy Storchaka en bpo-30285.)
re.compile()
ahora convierte el parámetro flags
en un objeto int si es RegexFlag
. Ahora es tan rápido como Python 3.5 y más rápido que Python 3.6 en aproximadamente un 10% dependiendo del patrón. (Contribuido por INADA Naoki en bpo-31671.)
El método modify()
de la clase selectors.EpollSelector
, selectors.PollSelector
y selectors.DevpollSelector
puede ser alrededor de un 10% más rápido bajo cargas pesadas. (Contribuido por Giampaolo Rodola en bpo-30014)
El plegado constante se ha movido del optimizador de mirilla al nuevo optimizador AST, que puede realizar optimizaciones de manera más consistente. (Contribuid por Eugene Toder y INADA Naoki en bpo-29469 y bpo-11549.)
La mayoría de funciones y métodos en abc
se han reescrito en C. Esto hace que la creación de clases base abstractas y la llamada a isinstance()
y issubclass()
en ellas sean 1.5 veces más rápidas. Esto también reduce el tiempo de inicio de Python hasta en un 10%. (Contribuido por Ivan Levkivskyi y INADA Naoki en bpo-31333)
Mejoras significativas de velocidad para constructores alternativos para datetime.date
y datetime.datetime
mediante el uso de constructores de ruta rápida cuando no se construyen subclases. (Contribuido por Paul Ganssle en bpo-32403)
La velocidad de comparación de instancias de array.array
se ha mejorado considerablemente en determinados casos. Ahora es de 10 a 70 veces más rápido cuando se comparan matrices que contienen valores del mismo tipo de entero. (Contribuido por Adrian Wielgosik en bpo-24700.)
Las funciones math.erf()
y math.erfc()
ahora use la implementación de la biblioteca C (más rápida) en la mayoría de las plataformas. (Contribuido por Serhiy Storchaka en bpo-26121.)
Otros cambios de implementación de CPython¶
Los ganchos de seguimiento ahora pueden optar por no recibir
line
y optar por recibir los eventosopcode
del intérprete configurando los nuevos atributosf_trace_lines
yf_trace_opcodes
correspondientes en el marco que se está rastreando. (Contribuido por Nick Coghlan en bpo-31344).Se corrigieron algunos problemas de coherencia con los atributos del módulo del paquete de espacio de nombres. Los objetos del módulo de espacio de nombres ahora tienen un
__file__
que está configurado comoNone
(previamente no configurado), y su__spec__.origin
también está configurado comoNone
(anteriormente la cadena"namespace"
). Ver bpo-32305. Además, el__spec__.loader
del objeto del módulo de espacio de nombres se establece en el mismo valor que__loader__
(anteriormente, el primero se estableció enNone
). Ver bpo-32303.El diccionario
locals()
ahora se muestra en el orden léxico en que se definieron las variables. Anteriormente, el orden no estaba definido. (Contribuido por Raymond Hettinger en bpo-32690.)El comando
distutils
upload
ya no intenta cambiar los caracteres de fin de línea CR a CRLF. Esto soluciona un problema de corrupción con sdists que terminaban con un byte equivalente a CR. (Contribuido por Bo Bayles en bpo-32304).
Comportamiento obsoleto de Python¶
Las expresiones de rendimiento (tanto las cláusulas yield
como las cláusulas yield from
) ahora están en desuso en las comprensiones y las expresiones generadoras (aparte de la expresión iterable en la cláusula más a la izquierda for
). Esto asegura que las comprensiones siempre devuelvan inmediatamente un contenedor del tipo apropiado (en lugar de potencialmente devolver un objeto generator iterator), mientras que las expresiones generadoras no intentarán intercalar su salida implícita con la salida de ninguna expresión de rendimiento explícita. En Python 3.7, tales expresiones emiten DeprecationWarning
cuando se compilan, en Python 3.8 será un SyntaxError
. (Contribuido por Serhiy Storchaka en bpo-10544.)
Devolviendo una subclase de complex
desde object.__complex__()
está obsoleto y será un error en futuras versiones de Python. Esto hace que __complex__()
se compatible con object.__int__()
y object.__float__()
. (Contribuido por Serhiy Storchaka en bpo-28894.)
Módulos, funciones y métodos de Python obsoletos¶
aifc¶
aifc.openfp()
ha quedado obsoleto y se eliminará en Python 3.9. Utilice aifc.open()
en su lugar. (Contribuido por Brian Curtin en bpo-31985).
asyncio¶
Se ha desaprobado el soporte para instancias en await
de asyncio.Lock
y otras primitivas de sincronización asyncio directamente. Se debe utilizar un administrador de contexto asincrónico para adquirir y liberar el recurso de sincronización. (Contribuido por Andrew Svetlov en bpo-32253.)
Los métodos asyncio.Task.current_task()
y asyncio.Task.all_tasks()
han quedado obsoletos. (Contribución de Andrew Svetlov en bpo-32250).
collections¶
En Python 3.8, las clases base abstractas en collections.abc
ya no estará expuesto en el módulo regular collections
. Esto ayudará a crear una distinción más clara entre las clases concretas y las clases base abstractas. (Contribuido por Serhiy Storchaka en bpo-25988.)
dbm¶
dbm.dumb
ahora admite la lectura de archivos de solo lectura y ya no escribe el archivo de índice cuando no se cambia. Ahora se emite una advertencia de obsolescencia si falta el archivo de índice y se recrea en los modos ’r’
y ’w’
(esto será un error en futuras versiones de Python). (Contribuido por Serhiy Storchaka en bpo-28847.)
enum¶
En Python 3.8, intentar buscar objetos que no sean Enum en clases Enum
lanzará un TypeError
(por ejemplo, 1 in Color
); de manera similar, si se intenta buscar objetos que no sean miembro de la Flag
se lanzará TypeError
(por ejemplo, 1 in Perm.RW
); actualmente, ambas operaciones devuelven False
en su lugar.
gettext¶
Usando un valor no entero para seleccionar una forma plural en gettext
ahora está en desuso. Nunca funcionó correctamente. (Contribuido por Serhiy Storchaka en bpo-28692.)
importlib¶
Los métodos MetaPathFinder.find_module()
(reemplazado por MetaPathFinder.find_spec()
) y PathEntryFinder.find_loader()
(reemplazado por PathEntryFinder.find_spec()
), ambos obsoletos en Python 3.4, ahora emiten DeprecationWarning
. (Contribuido por Matthias Bussonnier en bpo-29576).
El importlib.abc.ResourceLoader
ABC ha quedado obsoleto en favor de importlib.abc.ResourceReader
.
locale¶
locale.format()
ha sido obsoleto, en su lugar use locale.format_string()
. (Contribuido por Garvit en bpo-10379.)
macpath¶
El macpath
esta ahora en desuso y se eliminará en Python 3.8. (Contribuido por Chi Hsuan Yen en bpo-9850.)
threading¶
dummy_threading
y _dummy_thread
han quedado obsoletos. Ya no es posible compilar Python con los subprocesos deshabilitados. Utilice threading
en su lugar. (Contribuido por Antoine Pitrou en bpo-31370).
socket¶
El truncamiento del valor del argumento silencioso en socket.htons()
y socket.ntohs()
ha quedado en desuso. En futuras versiones de Python, si el argumento pasado es mayor de 16 bits, se lanzará una excepción. (Contribuido por Oren Milman en bpo-28332.)
ssl¶
ssl.wrap_socket()
esta en desuso. En su lugar use ssl.SSLContext.wrap_socket()
. (Contribuido por Christian Heimes en bpo-28124.)
sunau¶
sunau.openfp()
ha quedado obsoleto y se eliminará en Python 3.9. Utilice sunau.open()
en su lugar. (Contribuido por Brian Curtin en bpo-31985).
sys¶
sys.set_coroutine_wrapper()
y sys.get_coroutine_wrapper()
en desuso.
La función indocumentada sys.callstats()
ha quedado obsoleto y se eliminará en una futura versión de Python. (Contribuido por Victor Stinner en bpo-28799.)
wave¶
wave.openfp()
ha quedado obsoleta y sera removida en Python 3.9. En su lugar use wave.open()
. (Contribuido por Brian Curtin en bpo-31985.)
Funciones y tipos obsoletos de la API C¶
Función PySlice_GetIndicesEx()
está en desuso y se reemplaza con una macro si Py_LIMITED_API
no está configurado o configurado en un valor en el rango entre 0x03050400
y 0x03060000
(no incluido), o es 0x03060100
o superior. (Contribuido por Serhiy Storchaka en bpo-27867.)
PyOS_AfterFork()
ha quedado obsoleto. En su lugar usar PyOS_BeforeFork()
, PyOS_AfterFork_Parent()
o PyOS_AfterFork_Child()
. (Contribuido por Antoine Pitrou en bpo-16500.)
Eliminación de soporte de plataforma¶
FreeBSD 9 y las versiones anteriores ya no son compatibles oficialmente.
Para una compatibilidad total con Unicode, incluso dentro de los módulos de extensión, ahora se espera que las plataformas *nix proporcionen al menos uno de
C.UTF-8
(configuración regional completa),C.utf8
(configuración regional completa) oUTF-8
(configuración regional exclusiva deLC_CTYPE
) como una alternativa a la configuración regionalC
heredada basada enASCII
.OpenSSL 0.9.8 y 1.0.1 ya no son compatibles, lo que significa que la compilación de CPython 3.7 con compatibilidad con SSL / TLS en plataformas más antiguas que aún usan estas versiones requiere opciones de compilación personalizadas que se vinculan a una versión más reciente de OpenSSL.
En particular, este problema afecta a las distribuciones LTS Linux Debian 8 (también conocido como “jessie”) y Ubuntu 14.04 (también conocido como “Trusty”), ya que todavía usan OpenSSL 1.0.1 por defecto.
Debian 9 (“stretch”) y Ubuntu 16.04 (“xenial”), así como las versiones recientes de otras versiones de LTS Linux (por ejemplo, RHEL / CentOS 7.5, SLES 12-SP3), usan OpenSSL 1.0.2 o posterior y siguen siendo compatibles en la configuración de compilación predeterminada.
El propio CI configuration file de CPython proporciona un ejemplo del uso de SSL compatibility testing infrastructure en el conjunto de pruebas de CPython para crear y vincular OpenSSL 1.1.0 en lugar de un sistema obsoleto proporcionado por OpenSSL.
Eliminaciones de API y funciones¶
Las siguientes funciones y API se han eliminado de Python 3.7:
La función
os.stat_float_times()
ha sido removida. Se introdujo en Python 2.3 por compatibilidad con versiones anteriores de Python 2.2 y quedó obsoleto desde Python 3.1.Los escapes desconocidos que consisten en
’\’
y una letra ASCII en las plantillas de reemplazo parare.sub()
quedaron obsoletos en Python 3.5 y ahora causarán un error.Se eliminó el soporte del argumento * exclude * en
tarfile.TarFile.add()
. Fue obsoleto en Python 2.7 y 3.2. Utilice el argumento * filtro * en su lugar.La función
ntpath.splitunc()
quedó obsoleta en Python 3.1 y ahora se ha eliminado. Utilicesplitdrive()
en su lugar.collections.namedtuple()
ya no admite el parámetro verbose o el atributo_source
que mostraba el código fuente generado para la clase de tupla nombrada. Esto fue parte de una optimización diseñada para acelerar la creación de clases. (Contribuido por Jelle Zijlstra con nuevas mejoras de INADA Naoki, Serhiy Storchaka, y Raymond Hettinger en bpo-28638.)Funciones
bool()
,float()
,list()
ytuple()
ya no aceptan argumentos de palabras clave. El primer argumento deint()
ahora solo se puede pasar como argumento posicional.Eliminado anteriormente en desuso en las clases de Python 2.4
Plist
,Dict
y_InternalDict
en el móduloplistlib
. Dictar valores en el resultado de funcionesreadPlist()
yreadPlistFromBytes()
ahora son dictados normales. Ya no puede utilizar el acceso a atributos para acceder a elementos de estos diccionarios.La función
asyncio.windows_utils.socketpair()
ha sido removida. En su lugar use la funciónsocket.socketpair()
, está disponible en todas las plataformas desde Python 3.5.asyncio.windows_utils.socketpair
era un alias parasocket.socketpair
en Python 3.5 y mas nuevo.asyncio
ya no exporta los módulosselectors
y_overlapped
comoasyncio.selectors
yasyncio._overlapped
. Reemplacefrom asyncio import selectors
porimport selectors
.Instanciación directa de objetos
ssl.SSLSocket
yssl.SSLObject
ahora está prohibido. Los constructores nunca fueron documentados, probados o diseñados como constructores públicos. Se suponía que los usuarios usabanssl.wrap_socket()
ossl.SSLContext
. (Contribuido por Christian Heimes en bpo-32951.)Se ha eliminado el comando
distutils
install_misc
no utilizado. (Contribuido por Eric N. Vander Weele en bpo-29218).
Eliminaciones de módulos¶
El modulo fpectl
ha sido removido. Nunca se habilitó de forma predeterminada, nunca funcionó correctamente en x86-64 y cambió la ABI de Python de manera que causó la rotura inesperada de las extensiones C. (Contribuido por Nathaniel J. Smith en bpo-29137.)
Cambios solo en Windows¶
El lanzador de python, (py.exe), puede aceptar especificadores de 32 y 64 bits sin tener que especificar también una versión secundaria. Entonces, py -3-32
y py -3-64
se vuelven válidos, así como py -3.7-32
, también los -m-64 and -m.n-64. Los formularios ahora se aceptan para forzar Python de 64 bits incluso si de otro modo se hubieran utilizado 32 bits. Si la versión especificada no está disponible, py.exe saldrá del error. (Contribuido por Steve Barnes en bpo-30291.)
El lanzador se puede ejecutar como py -0
para producir una lista de las pitones instaladas, con las marcas predeterminadas con un asterisco. La ejecución de py -0p
incluirá las rutas. Si py se ejecuta con un especificador de versión que no puede coincidir, también imprimirá la forma corta lista de especificadores disponibles. (Contribuido por Steve Barnes en bpo-30362.)
Portando a Python 3.7¶
Esta sección enumera los cambios descritos anteriormente y otras correcciones de errores que pueden requerir cambios en su código.
Cambios en el comportamiento de Python¶
async
yawait
los nombres ahora son palabras clave reservadas. El código que usa estos nombres como identificadores lanzará ahora unSyntaxError
. (Contribuido por Jelle Zijlstra en bpo-30406.)PEP 479 está habilitado para todo el código en Python 3.7, lo que significa que las excepciones de
StopIteration
generadas directa o indirectamente en corutinas y generadores se transforman en excepciones deRuntimeError
. (Contribuido por Yury Selivanov en bpo-32670.)Los métodos
object.__aiter__()
ya no se pueden declarar cómo asincrónicos. (Contribuido por Yury Selivanov en bpo-31709.)Debido a un descuido, las versiones anteriores de Python aceptaron erróneamente la siguiente sintaxis:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 ahora lanza correctamente una
SyntaxError
, como una expresión generadora siempre debe estar directamente dentro de un conjunto de paréntesis y no puede tener una coma a ambos lados, y la duplicación de los paréntesis solo se puede omitir en las llamadas. (Contribuido por Serhiy Storchaka en bpo-32012 y bpo-32023.)Al usar el interruptor
-m
, el directorio de trabajo inicial ahora se agrega a: datasys.path
, en lugar de una cadena vacía (que denota dinámicamente el directorio de trabajo actual en el momento de cada importación). Cualquier programa que esté comprobando la cadena vacía, o que dependa de otro modo del comportamiento anterior, deberá actualizarse en consecuencia (por ejemplo, comprobando también si hayos.getcwd()
oos.path.dirname(__main__.__file__)
, dependiendo de por qué el código buscaba la cadena vacía en primer lugar).
Cambios en la API Python¶
socketserver.ThreadingMixIn.server_close()
ahora espera hasta que se completen todos los subprocesos que no son demonios. Establezca el nuevo atributo de clasesocketserver.ThreadingMixIn.block_on_close
enFalse
para obtener el comportamiento anterior a 3.7. (Contribuido por Victor Stinner en bpo-31233 y bpo-33540.)socketserver.ForkingMixIn.server_close()
ahora espera hasta que se completen todos los procesos secundarios. Establezca el nuevo atributo de clasesocketserver.ForkingMixIn.block_on_close
enFalse
para obtener el comportamiento anterior a 3.7. (Contribuido por Victor Stinner en bpo-31151 y bpo-33540.)La función
locale.localeconv()
ahora establece temporalmente la configuración regionalLC_CTYPE
en el valor de`LC_NUMERIC
en algunos casos. (Contribuido por Victor Stinner en bpo-31900.)pkgutil.walk_packages()
ahora genera unValueError
si la* ruta * es una cadena. Anteriormente se devolvió una lista vacía. (Contribuido por Sanyam Khurana en bpo-24744.)Un argumento de cadena de formato para
string.Formatter.format()
es ahora solo posicional. Pasarlo como un argumento de palabra clave quedó obsoleto en Python 3.5. (Contribuido por Serhiy Storchaka en bpo-29193.)Atributos
key
,value
ycoded_value
de la clasehttp.cookies.Morsel
ahora son de solo lectura. La asignación a ellos quedó obsoleta en Python 3.5. Utilizar el métodoset()
para configurarlos. (Contribuido por Serhiy Storchaka en bpo-29192.)El argumento mode de
os.makedirs()
ya no afecta los bits de permiso de archivo de los directorios de nivel intermedio recién creados. Para configurar sus bits de permiso de archivo, puede configurar umask antes de invocarmakedirs()
. (Aportado por Serhiy Storchaka en bpo-19930.)El tipo
struct.Struct.format
ahora esstr
en lugar de: classbytes
. (Contribuido por Victor Stinner en bpo-21071.)cgi.parse_multipart()
ahora acepta los argumentos encoding y errors y devuelve los mismos resultados queFieldStorage
: para los campos que no son archivos, el valor asociado a una clave es una lista de cadenas, no bytes. (Contribuido por Pierre Quentel en bpo-29979).Debido a cambios internos en
socket
, llamarsocket.fromshare()
en un socket creado porsocket.share
en versiones anteriores de Python no es compatible.repr
paraBaseException
ha cambiado para no incluir la coma final. La mayoría de las excepciones se ven afectadas por este cambio. (Contribuido por Serhiy Storchaka en bpo-30399.)repr
paradatetime.timedelta
ha cambiado para incluir los argumentos de palabras clave en la salida. (Contribuido por Utkarsh Upadhyay en bpo-30302.)Debido a que
shutil.rmtree()
ahora se implementa usando la funciónos.scandir()
, el controlador especificado por el usuario onerror ahora se llama con el primer argumentoos.scandir
en lugar deos.listdir
cuando falla el listado del directorio.Es posible que en el futuro se agregue soporte para conjuntos anidados y operaciones de conjuntos en expresiones regulares como en Unicode Technical Standard #18. Esto cambiaría la sintaxis. Para facilitar este cambio futuro, por el momento, se planteará un
FutureWarning
en casos ambiguos. Que incluyen conjuntos que comienzan con un literal’[‘
o que contienen secuencias de caracteres literales’—‘
,’&&’
,’~~’
, and’||’
. Para evitar una advertencia, escapa de ellos con una barra invertida. (Contribuido por Serhiy Storchaka en bpo-30349.)El resultado de dividir una cuerda en un
expresión regular
que podría coincidir con una cadena vacía. Por ejemplo, dividir enr’\s*’
ahora dividirá no solo en espacios en blanco como lo hizo anteriormente, sino también en cadenas vacías antes de todos los caracteres que no sean espacios en blanco y justo antes del final de la cadena. El comportamiento anterior se puede restaurar cambiando el patrón ar’\s+’
. UnaFutureWarning
se emitió para tales patrones desde Python 3.5.Para patrones que coinciden con cadenas vacías y no vacías, el resultado de la búsqueda de todas las coincidencias también puede cambiarse en otros casos. Por ejemplo en la cadena
'a\n\n'
, el patrón’\n'
no solo coincidirá con cadenas vacías en las posiciones 2 y 3, sino también la cadena'\n'
en las posiciones 2–3. Para hacer coincidir solo líneas en blanco, el patrón debe reescribirse comor'(?m)^[^\S\n]*$'
.re.sub()
ahora reemplaza las coincidencias vacías adyacentes a una coincidencia no vacía anterior. Por ejemplo,re.sub('x*', '-', 'abxd')
ahora devuelve'-a-b--d-'
en lugar de'-a-b-d-'
(el primer signo menos entre “b” y “d” reemplaza a “x”, y el segundo signo menos reemplaza a una cadena vacía entre “x” y “d”).(Contribuido por Serhiy Storchaka en bpo-25054 y bpo-32308.)
Cambie
re.escape()
para escapar solo de los caracteres especiales regex en lugar de escapar de todos los caracteres que no sean letras ASCII, números y’_’
. (Contribuido por Serhiy Storchaka en bpo-29995.)Los marcos
tracemalloc.Traceback
ahora se ordenan del más antiguo al más reciente para ser más coherentes contraceback
. (Contribuido por Jesse Bakker en bpo-32121.)En sistemas operativos que admiten banderas de bits
socket.SOCK_NONBLOCK
osocket.SOCK_CLOEXEC
, elsocket.type
ya no los tiene aplicados. Por lo tanto, comprobaciones comoif sock.type == socket.SOCK_STREAM
funcionan como se espera en todas las plataformas. (Contribuido por Yury Selivanov en bpo-32331.)En Windows, el valor predeterminado para el argumento close_fds de
subprocess.Popen
se cambió deFalse
aTrue
al redirigir los identificadores estándar. Si anteriormente dependía de que los identificadores fueran heredados al usarsubprocess.Popen
con la redirección estándar de io, tendrá que pasarclose_fds=False
para preservar el comportamiento anterior, o usarSTARTUPINFO.lpAttributeList
.importlib.machinery.PathFinder.invalidate_caches()
– que afecta implícitamente aimportlib.invalidate_caches()
– ahora borra entradas ensys.path_importer_cache
que están configuradas enNone
. (Contribuido por Brett Cannon en bpo-33169.)En
asyncio
,loop.sock_recv()
,loop.sock_sendall()
,loop.sock_accept()
,loop.getaddrinfo()
,loop.getnameinfo()
se han cambiado para que sean métodos de rutina adecuados para que coincidan con su documentación. Anteriormente, estos métodos devolvían instanciasasyncio.Future
. (Contribuido por Yury Selivanov en bpo-32327.)asyncio.Server.sockets
ahora devuelve una copia de la lista interna de sockets del servidor, en lugar de devolverla directamente. (Contribuido por Yury Selivanov en bpo-32662.)Struct.format
es ahora una instanciastr
en lugar de una instanciabytes
. (Contribuido por Victor Stinner en bpo-21071.)argparse
subparsers ahora pueden hacerse obligatorios pasandorequired=True
aArgumentParser.add_subparsers()
. (Contribuido por Anthony Sottile en bpo-26510.)El sistema
ast.literal_eval()
es ahora más estricto. Ya no se permite la suma ni la resta de números arbitrarios. (Contribuido por Serhiy Storchaka en bpo-31778).Calendar.itermonthdates
ahora lanzará una excepción cuando una fecha cae fuera del rango de0001-01-01
a9999-12-31
. Para admitir aplicaciones que no pueden tolerar tales excepciones, se puede utilizar el nuevoCalendar.itermonthdays3
yCalendar.itermonthdays4
. Los nuevos métodos devuelven tuplas y no están restringidos por el rango admitido pordatetime.date
. (Contribuido por Alexander Belopolsky en bpo-28292.)collections.ChainMap
ahora conserva el orden de las asignaciones subyacentes. (Contribuido por Raymond Hettinger en bpo-32792.)El método
submit()
deconcurrent.futures.ThreadPoolExecutor
yconcurrent.futures.ProcessPoolExecutor
ahora genera unRuntimeError
si se llama durante el cierre del intérprete. (Contribuido por Mark Nemec en bpo-33097.)El constructor
configparser.ConfigParser
ahora usaread_dict()
para procesar los valores predeterminados, haciendo que su comportamiento sea coherente con el resto del analizador. Las claves y los valores que no son cadenas en el diccionario de valores predeterminados ahora se están convirtiendo implícitamente en cadenas. (Contribuido por James Tocknell en bpo-23835.)Se eliminaron varias importaciones internas indocumentadas. Un ejemplo es que
os.errno
ya no está disponible; useimport errno
directamente en su lugar. Tenga en cuenta que estas importaciones internas no documentadas pueden eliminarse en cualquier momento sin previo aviso, incluso en las versiones micro.
Cambios en la API de C¶
La función PySlice_GetIndicesEx()
se considera insegura para secuencias de tamaño variable. Si los índices de corte no son instancias de int
, sino objetos que implementan el método __index__()
, la secuencia se puede cambiar de tamaño después de pasar su longitud a PySlice_GetIndicesEx()
. Esto puede llevar a que se devuelvan índices fuera de la longitud de la secuencia. Esto puede llevar a devolver índices fuera de la longitud de la secuencia. Para evitar posibles problemas, use las nuevas funciones PySlice_Unpack()
y PySlice_AdjustIndices()
. (Contribuido por Serhiy Storchaka en bpo-27867.)
Cambios en el código de bytes de CPython¶
There are two new opcodes: LOAD_METHOD
and CALL_METHOD
.
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)
The STORE_ANNOTATION
opcode has been removed.
(Contributed by Mark Shannon in bpo-32550.)
Cambios solo en Windows¶
El archivo utilizado para anular sys.path
ahora se llama <python-executable>._pth
en lugar de 'sys.path'
. Consulte Encontrar módulos para obtener más información. (Aportado por Steve Dower en bpo-28137.)
Otra implementación de cambios en CPython¶
En preparación para posibles cambios futuros en la API pública de inicialización del tiempo de ejecución de CPython (ver PEP 432 para un borrador inicial, pero algo desactualizado), La lógica de gestión de configuración y puesta en marcha interna de CPython se ha re-factorizado significativamente. Si bien estas actualizaciones están destinadas a ser completamente transparentes tanto para las aplicaciones integradas como para los usuarios de la CLI de CPython normal, se mencionan aquí ya que la refactorización cambia el orden interno de varias operaciones durante el inicio del intérprete y, por lo tanto, pueden descubrir defectos previamente latentes, ya sea en aplicaciones incrustadas, o en el propio CPython. ( Inicialmente contribuido por Nick Coghlan y Eric Snow como parte de bpo-22257, y actualizado por Nick, Eric, y Victor Stinner en varios otros números). Algunos detalles conocidos afectados:
Actualmente, las aplicaciones integradas no pueden utilizar
PySys_AddWarnOptionUnicode()
debido al requisito de crear un objeto Unicode antes de llamar aPy_Initialize
. UtilicePySys_AddWarnOption()
en su lugar.Los filtros de advertencias agregados por una aplicación de incrustación con
PySys_AddWarnOption()
ahora deberían tener prioridad de manera más consistente sobre los filtros predeterminados establecidos por el intérprete
Debido a cambios en la forma en que se configuran los filtros de advertencias predeterminados, establecer Py_BytesWarningFlag
en un valor mayor que uno ya no es suficiente para que ambos emitan mensajes BytesWarning
y los conviertan en excepciones. En su lugar, se debe establecer la bandera (para hacer que las advertencias se emitan en primer lugar) y se debe agregar un filtro de advertencias explícito error::BytesWarning
para convertirlas en excepciones.
Debido a un cambio en la forma en que el compilador maneja las cadenas de documentos, el implícito return None
en el cuerpo de una función que consiste únicamente en una cadena de documentos ahora se marca como ocurriendo en la misma línea que la cadena de documentos, no en la línea de encabezado de la función.
El estado de excepción actual se ha movido del objeto de trama a la co-rutina. Esto simplificó el intérprete y corrigió un par de errores oscuros causados por tener un estado de excepción de intercambio al ingresar o salir de un generador. (Contribuido por Mark Shannon en bpo-25612.)
Cambios notables en Python 3.7.1¶
A partir de 3.7.1, Py_Initialize()
ahora lee y respeta constantemente todos los mismos ajustes de entorno que Py_Main()
(en versiones anteriores de Python, respetaba un subconjunto mal definido de esas variables de entorno, mientras que en Python 3.7.0 no leyó ninguna de ellas debido a bpo-34247). Si este comportamiento no es deseado, establezca Py_IgnoreEnvironmentFlag
en 1 antes de llamar a Py_Initialize()
.
En 3.7.1 la API C para las variables de Contexto ha sido actualizada para usar punteros PyObject
. Ver también bpo-34762.
En 3.7.1 el módulo tokenize
ahora emite un token NEWLINE
cuando se le proporciona una entrada que no tiene una nueva línea al final. Este comportamiento ahora coincide con lo que hace el tokenizador C internamente. (Contribuido por Ammar Askar en bpo-33899.)
Cambios notables en Python 3.7.2¶
En 3.7.2, venv
en Windows ya no copia los binarios originales, sino que crea scripts de redireccionamiento llamados python.exe
y pythonw.exe
en su lugar. Esto resuelve un problema de larga data en el que todos los entornos virtuales tendrían que actualizarse o recrearse con cada actualización de Python. Sin embargo, tenga en cuenta que esta versión aún requerirá la recreación de entornos virtuales para obtener los nuevos scripts.
Cambios notables en Python 3.7.6¶
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 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.)
Cambios notables en Python 3.7.10¶
Las versiones anteriores de Python permitían utilizar tanto ;
como &
como separadores de parámetros de consulta en urllib.parse.parse_qs()
y urllib.parse.parse_qsl()
. Por cuestiones de seguridad y para cumplir con las recomendaciones más recientes del W3C, esto se ha modificado para permitir solo una clave separadora, con &
como valor predeterminado. Este cambio también afecta a cgi.parse()
y cgi.parse_multipart()
, ya que utilizan las funciones afectadas internamente. Para obtener más detalles, consulte su documentación respectiva. (Contribuido por Adam Goldschmidt, Senthil Kumaran y Ken Jin en bpo-42967).
Cambios notables en Python 3.7.11¶
Una corrección de seguridad modifica el comportamiento de ftplib.FTP
para que no confíe en la dirección IPv4 enviada desde el servidor remoto al configurar un canal de datos pasivo. En su lugar, reutilizamos la dirección IP del servidor FTP. Para el código inusual que requiere el comportamiento anterior, configure un atributo trust_server_pasv_ipv4_address
en su instancia FTP en True
. (Consulte gh-87451)
La presencia de caracteres de nueva línea o de tabulación en partes de una URL permite algunas formas de ataques. Siguiendo la especificación WHATWG que actualiza RFC 3986, el analizador urllib.parse()
elimina de la URL los caracteres de nueva línea ASCII \n
, \r
y de tabulación \t
para evitar este tipo de ataques. Los caracteres eliminados se controlan mediante una nueva variable de nivel de módulo urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
. (Véase gh-88048)
Cambios notables en Python 3.7.14¶
La conversión entre int
y str
en bases distintas de 2 (binario), 4, 8 (octal), 16 (hexadecimal) o 32, como la base 10 (decimal), ahora genera un error ValueError
si la cantidad de dígitos en formato de cadena supera 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 una variable de entorno, un indicador de línea de comandos o las API de sys
. Consulte la documentación de integer string conversion length limitation. El límite predeterminado es de 4300 dígitos en formato de cadena.