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:

  • async y await ahora son palabras clave reservadas.

Nuevos módulos de biblioteca:

Nuevas funciones integradas:

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:

Mejoras en la implementación de CPython:

Mejoras en la API de C:

  • PEP 539, nueva API de C para almacenamiento local de subprocesos

Mejoras de Documentación:

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 a DeprecationWarning o FutureWarning.

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 552Pycs 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:

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áusula async 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() y bytearray.fromhex() ahora ignore todos los espacios en blanco ASCII, no solo los espacios. (Contribuido por Robert Xiao en bpo-28927.)

  • str, bytes, y bytearray adquirió soporte para el nuevo método isascii(), 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 falla from 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 a str(x) antes que format(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 atributo tb_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 entorno PYTHONPROFILEIMPORTTIME 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:

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 a time.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 atributo sys.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 eventos opcode del intérprete configurando los nuevos atributos f_trace_lines y f_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 como None (previamente no configurado), y su __spec__.origin también está configurado como None (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ó en None). 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) o UTF-8 (configuración regional exclusiva de LC_CTYPE) como una alternativa a la configuración regional C heredada basada en ASCII.

  • 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 para re.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. Utilice splitdrive() 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() y tuple() ya no aceptan argumentos de palabras clave. El primer argumento de int() 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ódulo plistlib. Dictar valores en el resultado de funciones readPlist() y readPlistFromBytes() 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ón socket.socketpair(), está disponible en todas las plataformas desde Python 3.5. asyncio.windows_utils.socketpair era un alias para socket.socketpair en Python 3.5 y mas nuevo.

  • asyncio ya no exporta los módulos selectors y _overlapped como asyncio.selectors y asyncio._overlapped. Reemplace from asyncio import selectors por import selectors.

  • Instanciación directa de objetos ssl.SSLSocket y ssl.SSLObject ahora está prohibido. Los constructores nunca fueron documentados, probados o diseñados como constructores públicos. Se suponía que los usuarios usaban ssl.wrap_socket() o ssl.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 y await los nombres ahora son palabras clave reservadas. El código que usa estos nombres como identificadores lanzará ahora un SyntaxError. (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 de RuntimeError. (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: data sys.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 hay os.getcwd() o os.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 clase socketserver.ThreadingMixIn.block_on_close en False 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 clase socketserver.ForkingMixIn.block_on_close en False 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 regional LC_CTYPE en el valor de `LC_NUMERIC en algunos casos. (Contribuido por Victor Stinner en bpo-31900.)

  • pkgutil.walk_packages() ahora genera un ValueError 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 y coded_value de la clase http.cookies.Morsel ahora son de solo lectura. La asignación a ellos quedó obsoleta en Python 3.5. Utilizar el método set() 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 invocar makedirs(). (Aportado por Serhiy Storchaka en bpo-19930.)

  • El tipo struct.Struct.format ahora es str en lugar de: class bytes. (Contribuido por Victor Stinner en bpo-21071.)

  • cgi.parse_multipart() ahora acepta los argumentos encoding y errors y devuelve los mismos resultados que FieldStorage: 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, llamar socket.fromshare() en un socket creado por socket.share en versiones anteriores de Python no es compatible.

  • repr para BaseException 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 para datetime.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ón os.scandir(), el controlador especificado por el usuario onerror ahora se llama con el primer argumento os.scandir en lugar de os.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 en r’\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 a r’\s+’. Una FutureWarning 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 como r'(?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 con traceback. (Contribuido por Jesse Bakker en bpo-32121.)

  • En sistemas operativos que admiten banderas de bits socket.SOCK_NONBLOCK o socket.SOCK_CLOEXEC, el socket.type ya no los tiene aplicados. Por lo tanto, comprobaciones como if 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ó de False a True al redirigir los identificadores estándar. Si anteriormente dependía de que los identificadores fueran heredados al usar subprocess.Popen con la redirección estándar de io, tendrá que pasar close_fds=False para preservar el comportamiento anterior, o usar STARTUPINFO.lpAttributeList.

  • importlib.machinery.PathFinder.invalidate_caches() – que afecta implícitamente a importlib.invalidate_caches() – ahora borra entradas en sys.path_importer_cache que están configuradas en None. (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 instancias asyncio.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 instancia str en lugar de una instancia bytes. (Contribuido por Victor Stinner en bpo-21071.)

  • argparse subparsers ahora pueden hacerse obligatorios pasando required=True a ArgumentParser.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 de 0001-01-01 a 9999-12-31. Para admitir aplicaciones que no pueden tolerar tales excepciones, se puede utilizar el nuevo Calendar.itermonthdays3 y Calendar.itermonthdays4. Los nuevos métodos devuelven tuplas y no están restringidos por el rango admitido por datetime.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() de concurrent.futures.ThreadPoolExecutor y concurrent.futures.ProcessPoolExecutor ahora genera un RuntimeError si se llama durante el cierre del intérprete. (Contribuido por Mark Nemec en bpo-33097.)

  • El constructor configparser.ConfigParser ahora usa read_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; use import 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 a Py_Initialize. Utilice PySys_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.