# 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:

- `contextvars`: PEP 567 – Variables de Contexto

- `dataclasses`: PEP 557 – Clases de Datos

- importlib.resources

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 538, coerción de configuración regional de C heredada

  - PEP 540, modo de tiempo de ejecución UTF-8 forzado

- PEP 552, determinista .pycs

- El nuevo modo de ejecución de desarrollo

- 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 exceder 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 para el módulo `time`:

- `time.clock_gettime_ns()`

- `time.clock_settime_ns()`

- `time.monotonic_ns()`

- `time.perf_counter_ns()`

- `time.process_time_ns()`

- `time.time_ns()`

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 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á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.)

- In order to better support dynamic creation of stack traces, `types.TracebackType` can now be instantiated from Python code, and the `tb_next` attribute on tracebacks is now writable. (Contributed by Nathaniel J. Smith in 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 ABC nuevo para acceder, abrir y leer * recursos * dentro de los paquetes. Los recursos son más o menos similares a los archivos dentro de los paquetes, pero no es necesario que sean archivos reales en el sistema de archivos físico. Los cargadores de módulos proporcionar una función `get_resource_reader()` que devuelve una instancia `importlib.abc.ResourceReader` para admitir esta nueva API. Los cargadores de ruta de archivo 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()`, y `Future.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 instancia actual en ejecución `Task`, y la nueva función `asyncio.all_tasks()` devuelve un conjunto de todas las instancias de `Task` existentes en un bucle determinado. Los métodos `Task.current_task()` y `Task.all_tasks()` han quedado obsoletos. (Contribuido por 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 un `RuntimeError` si el bucle esta corriendo. Esto contrasta con `asyncio.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étodo `StreamWriter.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 usando `os.sendfile` cuando sea posible. (Contribuido por Andrew Svetlov en bpo-32410.)

- El nuevo método `Future.get_loop()` y `Task.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 de `asyncio.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 para `loop.create_server()` y `loop.create_unix_server()`, así como `Server.start_serving()`, y `Server.serve_forever()` se puede usar para desacoplar la instanciación y el servicio de servidor. El nuevo método `Server.is_serving()` devuelve `True` 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

      # At this point, srv is closed and no longer accepts new connections.

  (Contribuido por Yury Selivanov en bpo-32662.)

- Objetos de devolución de llamada devueltos por `loop.call_later()` conseguir el nuevo método `when()` 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()` devuelve `True` 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 a `ReadTransport.resume_reading()` y `ReadTransport.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 indicador `TCP_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` y `WindowsProactorEventLoopPolicy`. (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 es compatible con 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. (Contribuido por 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.)

The `socket` module now exposes the `socket.TCP_CONGESTION` (Linux 2.6.13), `socket.TCP_USER_TIMEOUT` (Linux 2.6.37), and `socket.TCP_NOTSENT_LOWAT` (Linux 3.12) constants. (Contributed by Omar Sandoval in bpo-26273 and Nathaniel J. Smith in bpo-29728.)

Support for `socket.AF_VSOCK` sockets has been added to allow communication between virtual machines and their hosts. (Contributed by Cathy Avery in 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.)

Added `ssl.SSLContext.post_handshake_auth` to enable and `ssl.SSLSocket.verify_client_post_handshake()` to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in 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

The `subprocess.run()` function accepts the new capture_output keyword argument. When true, stdout and stderr will be captured. This is equivalent to passing `subprocess.PIPE` as stdout and stderr arguments. (Contributed by Bo Bayles in 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`:

- `time.clock_gettime_ns()`

- `time.clock_settime_ns()`

- `time.monotonic_ns()`

- `time.perf_counter_ns()`

- `time.process_time_ns()`

- `time.time_ns()`

Se han agregado nuevos identificadores de reloj:

- `time.CLOCK_BOOTTIME` (Linux): Identical to `time.CLOCK_MONOTONIC`, except it also includes any time that the system is suspended.

- `time.CLOCK_PROF` (FreeBSD, NetBSD and OpenBSD): High-resolution per-process CPU timer.

- `time.CLOCK_UPTIME` (FreeBSD, OpenBSD): Time whose absolute value is the time the system has been running and not suspended, providing accurate uptime measurement.

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 nueva función `uu.encode()` ahora acepta un argumento opcional de palabra clave backtick. Mientras esto se verdadero, los ceros son representados por `’`’` 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

As mitigation against DTD and external entity retrieval, the `xml.dom.minidom` and `xml.sax` modules no longer process external entities by default. (Contributed by Christian Heimes in 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.)

The fields `name` and `doc` of structures `PyMemberDef`, `PyGetSetDef`, `PyStructSequence_Field`, `PyStructSequence_Desc`, and `wrapperbase` are now of type `const char *` rather of `char *`. (Contributed by Serhiy Storchaka in 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

- Trace hooks may now opt out of receiving the `line` and opt into receiving the `opcode` events from the interpreter by setting the corresponding new `f_trace_lines` and `f_trace_opcodes` attributes on the frame being traced. (Contributed by Nick Coghlan in 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 de CR a CRLF. Esto soluciona un problema de corrupción con sdists que terminaba 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. En su lugar use `aifc.open()`. (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. (Contribuido por 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

Métodos `MetaPathFinder.find_module()` (reemplazado por `MetaPathFinder.find_spec()`) y `PathEntryFinder.find_loader()` (reemplazado por `PathEntryFinder.find_spec()`) ambas en desuso 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 en desuso. ya no es posible compilar Python con el subproceso desactivado. En lugar use `threading`. (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. En lugar use `sunau.open()`. (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.

- The `ntpath.splitunc()` function was deprecated in Python 3.1, and has now been removed. Use `splitdrive()` instead.

- `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 el `selectors` y módulos como `_overlapped` `asyncio.selectors` y `asyncio._overlapped`. reemplazar por `from asyncio import selectors` y `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.)

- El comando no utilizado `distutils` `install_misc` ha sido eliminado. (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.)

- `parse_multipart()` ahora acepta los argumentos * codificación * y * errores * y devuelve los mismos resultados que `FieldStorage`: para campos que no son de archivo, 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 anterior no vacía. Por ejemplo `re.sub(‘x*’, ‘-‘, ‘abxd’)` retorno ahora `’-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 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.)

- `ast.literal_eval()` ahora es más estricto. Ya no se permiten sumas y restas 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

Hay dos nuevos códigos de operación: `LOAD_METHOD` y `CALL_METHOD`. (Contribuido por Yury Selivanov y INADA Naoki en bpo-26110.)

El código de operación `STORE_ANNOTATION` ha sido removido. (Contribuido por Mark Shannon en 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, `PySys_AddWarnOptionUnicode()` no se puede usar mediante la incorporación de aplicaciones debido al requisito de crear un objeto Unicode antes de llamar a `Py_Initialize`. Utilice `PySys_AddWarnOption()` en su lugar.

- filtros de advertencias agregados por una aplicación de incrustación con `PySys_AddWarnOption()` ahora debería tener prioridad 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 usar tanto `;` como `&` como separadores de parámetros de consulta en `urllib.parse.parse_qs()` y `urllib.parse.parse_qsl()`. Debido a problemas de seguridad y para cumplir con las recomendaciones más recientes del W3C, esto se ha cambiado 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.)

## Notable changes in Python 3.7.11

A security fix alters the `ftplib.FTP` behavior to not trust the IPv4 address sent from the remote server when setting up a passive data channel. We reuse the ftp server IP address instead. For unusual code requiring the old behavior, set a `trust_server_pasv_ipv4_address` attribute on your FTP instance to `True`. (See gh-87451)

The presence of newline or tab characters in parts of a URL allows for some forms of attacks. Following the WHATWG specification that updates RFC 3986, ASCII newline `\n`, `\r` and tab `\t` characters are stripped from the URL by the parser `urllib.parse()` preventing such attacks. The removal characters are controlled by a new module level variable `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (See gh-88048)

## Notable security feature in 3.7.14

Converting between `int` and `str` in bases other than 2 (binary), 4, 8 (octal), 16 (hexadecimal), or 32 such as base 10 (decimal) now raises a `ValueError` if the number of digits in string form is above a limit to avoid potential denial of service attacks due to the algorithmic complexity. This is a mitigation for CVE-2020-10735. This limit can be configured or disabled by environment variable, command line flag, or `sys` APIs. See the integer string conversion length limitation documentation. The default limit is 4300 digits in string form.