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 allows defining "__getattr__()" on modules and will call it
whenever a module attribute is otherwise not found.  Defining
"__dir__()" on modules is now also allowed.

Un ejemplo típico de dónde esto puede ser útil es la desaprobación de
los atributos del módulo y la carga diferida.

Ver también:

  **PEP 562** -- Módulo "__getattr__" y "__dir__"
     PEP escrito y implementado por *Ivan Levkivskyi*


PEP 564: Nuevas funciones de tiempo con resolución de nanosegundos
------------------------------------------------------------------

La resolución de los relojes en los sistemas modernos puede superar la
precisión limitada de un número de punto flotante devuelto por la
función "time.time()" y sus variantes. Para evitar la pérdida de
precisión, **PEP 564** agrega seis nuevas variantes de "nanosegundos"
de las funciones de temporizador existentes al módulo "time":

* "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
--------------------------------------------------------------------

Initially **PEP 484** was designed in such way that it would not
introduce *any* changes to the core CPython interpreter. Now type
hints and the "typing" module are extensively used by the community,
so this restriction is removed. The PEP introduces two special methods
"__class_getitem__()" and "__mro_entries__()", these methods are now
used by most classes and special constructs in "typing". As a result,
the speed of various operations with types increased up to 7 times,
the generic types can be used without metaclass conflicts, and several
long standing bugs in "typing" module are fixed.

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

* Para brindar un mejor soporte a la creación dinámica de seguimientos
  de pila, ahora se puede crear una instancia de "types.TracebackType"
  a partir del código Python, y el atributo "tb_next" en tracebacks
  ahora se puede escribir. (Contribución de Nathaniel J. Smith en
  bpo-30579).

* Al usar la "-m" switch, "sys.path[0]" ahora se expande con
  entusiasmo a la ruta completa del directorio de inicio, en lugar de
  dejarse como el directorio vacío (que permite importaciones desde el
  directorio de trabajo * actual * en el momento en que ocurre una
  importación) (Contribuido por *Nick Coghlan* en bpo-33053.)

* La nueva opción "-X" "importtime" o la variable de entorno
  "PYTHONPROFILEIMPORTTIME" pueden usarse para mostrar el tiempo de
  cada importación de módulos. (Contribuido por Inada Naoki en
  bpo-31415.)


Nuevos módulos
==============


*contextvars*
-------------

El nuevo módulo "contextvars" y un conjunto de nuevas APIs C
introducir soporte para *variables de contexto*. Las variables de
contexto son conceptualmente similares a las variables locales del
proceso. A diferencia de TLS, las variables de contexto admiten l
código asincrónico correctamente.

Los módulos "asyncio" y "decimal" se han actualizado para utilizar y
admitir variables de contexto listas para usar. En particular, el
contexto decimal activo ahora se almacena en una variable de contexto,
lo que permite que las operaciones decimales funcionen con el contexto
correcto en código asincrónico.

Ver también:

  **PEP 567** -- Variables de Contexto
     PEP escrito y implementado por *Yury Selivanov*


*dataclasses*
-------------

El nuevo decorador "dataclass()" proporciona una forma de declarar
*data classes*. Una clase de datos describe sus atributos usando
anotaciones de variables de clase. Su constructor y otros métodos
mágicos, como "__repr__()", "__eq__()", y "__hash__()" se generan
automáticamente.

Ejemplo:

   @dataclass
   class Point:
       x: float
       y: float
       z: float = 0.0

   p = Point(1.5, 2.5)
   print(p)   # produces "Point(x=1.5, y=2.5, z=0.0)"

Ver también:

  **PEP 557** -- Clases de Datos
     PEP escrito y implementado por *Eric V. Smith*


*importlib.resources*
---------------------

The new "importlib.resources" module provides several new APIs and one
new ABC for access to, opening, and reading *resources* inside
packages. Resources are roughly similar to files inside packages, but
they needn't be actual files on the physical file system.  Module
loaders can provide a "get_resource_reader()" function which returns a
"importlib.abc.ResourceReader" instance to support this new API.
Built-in file path loaders and zip file loaders both support this.

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
  "Task" que se está ejecutando actualmente y la nueva función
  "asyncio.all_tasks()" devuelve un conjunto de todas las instancias
  "Task" existentes en un bucle determinado. Los métodos
  "Task.current_task()" y "Task.all_tasks()" han quedado obsoletos.
  (Contribución de Andrew Svetlov en bpo-32250).

* La nueva clase *provisional* "BufferedProtocol" permite implementar
  protocolos de transmisión con control manual sobre el búfer de
  recepción. (Contribuido por *Yury Selivanov* en bpo-32251.)

* La nueva función "asyncio.get_running_loop()" devuelve el bucle que
  se está ejecutando actualmente, y genera 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

     # En éste momento, srv está cerrado y ya no acepta conexiones

  (Contribuido por *Yury Selivanov* en bpo-32662.)

* Objetos de devolución de llamada devueltos por "loop.call_later()"
  conseguir el nuevo mé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*
----------

The "cProfile" command line now accepts "-m module_name" as an
alternative to script path.  (Contributed by Sanyam Khurana in
bpo-21862.)


*crypt*
-------

El módulo "crypt" ahora admite el método de hash Blowfish.
(Contribuido por Serhiy Storchaka en bpo-31664).

La función "mksalt()" ahora permite especificar el número de rondas
para el hash. (Contribución de Serhiy Storchaka en bpo-31702).


*datetime*
----------

Los nuevos objetos "datetime.fromisoformat()" un método constructor
"datetime" de una cadena en uno de los formatos de salida de
"datetime.isoformat()". (Contribuido por *Paul Ganssle* en bpo-15873.)

La clase "tzinfo" ahora admite compensaciones de subminutos.
(Contribuido por *Alexander Belopolsky* en bpo-5288.)


*dbm*
-----

"dbm.dumb" ahora admite la lectura de archivos de solo lectura y ya no
escribe el archivo de índice cuándo no se cambia.


*decimal*
---------

El módulo "decimal" ahora usa variables de contexto para almacenar el
contexto decimal. (Contribuido por *Yury Selivanov* en bpo-32630.)


*dis*
-----

La función "dis()" ahora puede desensamblar objetos de código anidados
(el código de comprensiones, expresiones generadoras y funciones
anidadas, y el código utilizado para construir clases anidadas). La
profundidad máxima de la recursividad de desmontaje se controla
mediante el nuevo parámetro * profundidad *. (Contribuido por *Serhiy
Storchaka* en bpo-11822.)


*distutils*
-----------

"README.rst" ahora se incluye en la lista de READMEs estándar de
distutils y, por lo tanto, se incluye en las distribuciones de código
fuente. (Contribuido por *Ryan Gonzalez* en bpo-11913.)


*enum*
------

La "Enum" aprendió la nueva propiedad de clase "_ignore_", que permite
enumerar los nombres de propiedades que no deben convertirse en
miembros de enumeración. (Contribuido por *Ethan Furman* en
bpo-31801.)

In Python 3.8, attempting to check for non-Enum objects in "Enum"
classes will raise a "TypeError" (e.g. "1 in Color"); similarly,
attempting to check for non-Flag objects in a "Flag" member will raise
"TypeError" (e.g. "1 in Perm.RW"); currently, both operations return
"False" instead and are deprecated. (Contributed by Ethan Furman in
bpo-33217.)


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

The new "ThreadingHTTPServer" class uses threads to handle requests
using "ThreadingMixIn". It is used when "http.server" is run with
"-m". (Contributed by Julien Palard in 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*
-----------

The "importlib.abc.ResourceReader" ABC was introduced to support the
loading of resources from packages.  See also importlib.resources.
(Contributed by Barry Warsaw, Brett Cannon in bpo-32248.)

"importlib.reload()" ahora mejora "ModuleNotFoundError" si el módulo
carece de especificación. (Contribuido por *Garvit Khatri* en
bpo-29851.)

"importlib.util.find_spec()" now raises "ModuleNotFoundError" instead
of "AttributeError" if the specified parent module is not a package
(i.e. lacks a "__path__" attribute). (Contributed by Milan Oberkirch
in bpo-30436.)

The new "importlib.util.source_hash()" can be used to compute the hash
of the passed source.  A hash-based .pyc file embeds the value
returned by this function.


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

The new "Process.kill()" method can be used to terminate the process
using the "SIGKILL" signal on Unix. (Contributed by Vitor Pereira in
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.)

Se agregó compatibilidad con sockets "socket.AF_VSOCK" para permitir
la comunicación entre máquinas virtuales y sus hosts. (Contribución de
Cathy Avery en bpo-27584).

Los sockets ahora detectan automáticamente la familia, el tipo y el
protocolo del descriptor de archivo de forma predeterminada.
(Contribuido por *Christian Heimes* en bpo-28134.)


*socketserver*
--------------

"socketserver.ThreadingMixIn.server_close" now waits until all non-
daemon threads complete. "socketserver.ForkingMixIn.server_close" now
waits until all child processes complete.

Add a new "socketserver.ForkingMixIn.block_on_close" class attribute
to "socketserver.ForkingMixIn" and "socketserver.ThreadingMixIn"
classes. Set the class attribute to "False" to get the pre-3.7
behaviour.


*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*
-----

The "ssl" module now uses OpenSSL's builtin API instead of
"match_hostname()" to check a host name or an IP address.  Values are
validated during TLS handshake.  Any certificate validation error
including failing the host name check now raises
"SSLCertVerificationError" and aborts the handshake with a proper TLS
Alert message.  The new exception contains additional information.
Host name validation can be customized with
"SSLContext.hostname_checks_common_name". (Contributed by Christian
Heimes in 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()" no longer supports partial wildcards like
"www*.example.org". (Contributed by Mandeep Singh in bpo-23033 and
Christian Heimes in bpo-31399.)

La selección del conjunto de cifrado predeterminado del módulo "ssl"
ahora usa un enfoque de lista negra en lugar de una lista blanca
codificada. Python ya no vuelve a habilitar los cifrados que han sido
bloqueados por las actualizaciones de seguridad de OpenSSL. La
selección del conjunto de cifrado predeterminado se puede configurar
en tiempo de compilación. (Contribuido por *Christian Heimes* en
bpo-31429.)

Ahora se admite la validación de certificados de servidor que
contienen nombres de dominio internacionalizados (IDN). Como parte de
este cambio, el atributo "SSLSocket.server_hostname" ahora almacena el
nombre de host esperado en forma de etiqueta A ("”xn--pythn-
mua.org”"), en lugar de la forma de etiqueta U ("”pythön.org”").
(Contribuido por *Nathaniel J. Smith* y *Christian Heimes* en
bpo-28414.)

El módulo "ssl" tiene soporte preliminar y experimental para TLS 1.3 y
OpenSSL 1.1.1. En el momento del lanzamiento de Python 3.7.0, OpenSSL
1.1.1 todavía está en desarrollo y TLS 1.3 aún no se ha finalizado. El
protocolo y el protocolo de enlace TLS 1.3 se comportan de forma
ligeramente diferente a TLS 1.2 y versiones anteriores, consulte TLS
1.3. (Contribuido por *Christian Heimes* en bpo-32947, bpo-20995,
bpo-29136, bpo-30622 y bpo-33618)

"SSLSocket" y "SSLObject" ya no tiene un constructor público. La
creación de instancias directa nunca fue una característica
documentada y compatible. Las instancias deben crearse con métodos
"SSLContext" "wrap_socket()" y "wrap_bio()". (Contribuido por
*Christian Heimes* en bpo-32951)

Las API de OpenSSL 1.1 para configurar la versión mínima y máxima del
protocolo TLS están disponibles como "SSLContext.minimum_version" y
"SSLContext.maximum_version". Los protocolos admitidos se indican
mediante varios indicadores nuevos, como "HAS_TLSv1_1". (Contribuido
por *Christian Heimes* en bpo-32609.)

Se agregó "ssl.SSLContext.post_handshake_auth" para habilitar y
"ssl.SSLSocket.verify_client_post_handshake()" para iniciar la
autenticación posterior al protocolo de enlace TLS 1.3. (Contribuido
por Christian Heimes en gh-78851.)


*string*
--------

"string.Template" ahora le permite modificar opcionalmente el patrón
de expresión regular para marcadores de posición reforzados y
marcadores de posición no reforzados por separado. (Contribuido por
*Barry Warsaw* en bpo-1198569.)


*subprocess*
------------

La función "subprocess.run()" acepta el nuevo argumento de palabra
clave *capture_output*. Cuando es verdadero, se capturarán stdout y
stderr. Esto es equivalente a pasar "subprocess.PIPE" como argumentos
*stdout* y *stderr*. (Contribuido por Bo Bayles en bpo-32102).

La función "subprocess.run" y el constructor "subprocess.Popen" ahora
aceptan la palabra clave del argumento *text* como un alias para
*universal_newlines*. (Contribuido por *Andrew Clegg* en bpo-31756.)

En Windows, el valor predeterminado de *close_fds* se cambió de
"False" a "True" al redirigir los identificadores estándar. Ahora es
posible establecer *close_fds* en verdadero al redirigir los
identificadores estándar. Ver "subprocess.Popen". Esto significa que
*close_fds* ahora tiene el valor predeterminado de "True" en todas las
plataformas compatibles. (Contribuido por *Segev Finer* en bpo-19764.)

El módulo de subproceso ahora es más elegante al manejar
"KeyboardInterrupt" durante: "subprocess.call()", "subprocess.run()",
o en un administrador de contexto "Popen". Ahora espera un corto
período de tiempo para que el niño salga, antes de continuar con el
manejo de la excepción "KeyboardInterrupt". (Contribuido por *Gregory
P. Smith* en bpo-25942.)


*sys*
-----

La nueva función de enganche "sys.breakpointhook()" es llamada por la
incorporada "breakpoint()". (Contribuido por *Barry Warsaw* en
bpo-31353.)

En Android, la nueva "sys.getandroidapilevel()" devuelve la versión de
la API de Android en tiempo de compilación. (Contribuido por *Victor
Stinner* en bpo-28740.)

The new "sys.get_coroutine_origin_tracking_depth()" function returns
the current coroutine origin tracking depth, as set by the new
"sys.set_coroutine_origin_tracking_depth()".  "asyncio" has been
converted to use this new API instead of the deprecated
"sys.set_coroutine_wrapper()". (Contributed by Nathaniel J. Smith in
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): idéntico a "time.CLOCK_MONOTONIC",
  excepto que también incluye cualquier momento en que el sistema esté
  suspendido.

* "time.CLOCK_PROF" (FreeBSD, NetBSD y OpenBSD): Temporizador de CPU
  por proceso de alta resolución.

* "time.CLOCK_UPTIME" (FreeBSD, OpenBSD): Tiempo cuyo valor absoluto
  es el tiempo que el sistema ha estado funcionando y no suspendido,
  proporcionando una medición precisa del tiempo de actividad.

La nuevas funciones "time.thread_time()" y "time.thread_time_ns()" se
puede utilizar para obtener medidas de tiempo de CPU por subproceso.
(Contribuido por *Antoine Pitrou* en bpo-32025.)

La nueva función "time.pthread_getcpuclockid()" devuelve el ID de
reloj del reloj de tiempo de CPU específico del subproceso.


*tkinter*
---------

La nueva clase "tkinter.ttk.Spinbox" esta disponible ahora.
(Contribuido por *Alan Moore* en bpo-32585.)


*tracemalloc*
-------------

"tracemalloc.Traceback" se comporta más como rastreos regulares,
ordenando los fotogramas del más antiguo al más reciente.
"Traceback.format()" ahora acepta *límite* negativo, truncando el
resultado a los marcos más antiguos de "abs(limit)". Para obtener el
comportamiento anterior, use el nuevo argumento *most_recent_first*
para "Traceback.format()". (Contribuido por *Jesse Bakker* en
bpo-32121.)


*types*
-------

Las nuevas clases "WrapperDescriptorType", "MethodWrapperType",
"MethodDescriptorType", y "ClassMethodDescriptorType" ahora están
disponibles. (Contribuido por *Manuel Krebber* y *Guido van Rossum* en
bpo-29377, y *Serhiy Storchaka* en bpo-32265.)

La nueva función "types.resolve_bases()" resuelve las entradas MRO
dinámicamente según lo especificado por **PEP 560**. (Contribuido por
*Ivan Levkivskyi* en bpo-32717.)


*unicodedata*
-------------

La base de datos interna "unicodedata" se actualizó para usar Unicode
11. (Aportado por Benjamín Peterson.)


*unittest*
----------

La nueva opción de la linea de comandos "-k" permite filtrar pruebas
por una subcadena de nombre o un patrón similar a un shell de Unix.
Por ejemplo, "python -m unittest -k foo" ejecuta
"foo_tests.SomeTest.test_something", "bar_tests.SomeTest.test_foo",
pero no "bar_tests.FooTest.test_something". (Contribuido por *Jonas
Haag* en bpo-32071.)


*unittest.mock*
---------------

Los atributos "sentinel" ahora preservan su identidad cuando están
"copied" o "pickled". (Contribuido por *Serhiy Storchaka* en
bpo-20804.)

La nueva función "seal()" permite sellar instancias "Mock", que no
permitirá la creación de simulacros de atributos. El sello se aplica
de forma recursiva a todos los atributos que en sí mismos son burlas.
(Contribuido por *Mario Corchero* en bpo-30541.)


*urllib.parse*
--------------

"urllib.parse.quote()" ha sido actualizada desde **RFC 2396** a **RFC
3986**, agregado "~" para el conjunto de caracteres que nunca se
cotizan por defecto. (Contribuido por *Christian Theune* y *Ratnadeep
Debnath* en bpo-16285.)


*uu*
----

La función "uu.encode()" ahora acepta un argumento de palabra clave
*backtick* opcional. Cuando es verdadero, los ceros se representan con
"'`'" en lugar de espacios. (Contribuido por Xiang Zhang en
bpo-30103).


*uuid*
------

El nuevo atributo "UUID.is_safe" transmite información de la
plataforma sobre si los UUID generados se generan con un método seguro
para multiprocesamiento. (Contribuido por *Barry Warsaw* en
bpo-22807.)

"uuid.getnode()" ahora prefiere las direcciones MAC administradas
universalmente a las direcciones MAC administradas localmente. Esto
ofrece una mejor garantía de la unicidad global de los UUID devueltos
desde "uuid.uuid1()". Si solo hay disponibles direcciones MAC
administradas localmente, se devuelve la primera que se encuentre.
(Contribuido por *Barry Warsaw* en bpo-32107.)


*warnings*
----------

La inicialización de los filtros de advertencias predeterminados ha
cambiado de la siguiente manera:

* advertencias habilitadas a través de opciones de línea de comando
  (incluidos los de "-b" y la nueva opción específica de CPython "-X"
  "dev") siempre se pasan a la maquinaria de advertencias a través del
  atributo "sys.warnoptions".

* los filtros de advertencias habilitados a través de la línea de
  comandos o el entorno ahora tienen el siguiente orden de prioridad:

  * el filtro "BytesWarning" para "-b" (o "-bb")

  * cualquier filtro especificado con la opción "-W"

  * cualquier filtro especificado con la variable de entorno
    "PYTHONWARNINGS"

  * cualquier otro filtro específico de CPython (por ejemplo, el
    filtro "default" agregado para el nuevo modo "-X dev")

  * cualquier filtro implícito definido directamente por la maquinaria
    de advertencias

* en las compilaciones de depuración de CPython, ahora todas las
  advertencias se muestran de forma predeterminada (la lista de
  filtros implícitos está vacía)

(Contribuido por *Nick Coghlan* y *Victor Stinner* en bpo-20361,
bpo-32043, and bpo-32230.)

Las advertencias de obsolescencia se muestran una vez más de forma
predeterminada en scripts de un solo archivo y en el indicador
interactivo. Consultar PEP 565: Mostrar DeprecationWarning en __main__
para mas detalles. (Contribuido por *Nick Coghlan* en bpo-31975.)


xml
---

Como medida de mitigación frente a la recuperación de DTD y entidades
externas, los módulos "xml.dom.minidom" y "xml.sax" ya no procesan
entidades externas de forma predeterminada. (Contribuido por Christian
Heimes en gh-61441.)


*xml.etree*
-----------

ElementPath predicates in the "find()" methods can now compare text of
the current node with "[. = "text"]", not only text in children.
Predicates also allow adding spaces for better readability.
(Contributed by Stefan Behnel in bpo-31648.)


*xmlrpc.server*
---------------

"SimpleXMLRPCDispatcher.register_function()" can now be used as a
decorator.  (Contributed by Xiang Zhang in 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 Thread-specific storage API
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.)

The new import__find__load__start and import__find__load__done static
markers can be used to trace module imports. (Contributed by Christian
Heimes in 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.

The type of results of "PyThread_start_new_thread()" and
"PyThread_get_thread_ident()", and the *id* parameter of
"PyThreadState_SetAsyncExc()" changed from long to unsigned long.
(Contributed by Serhiy Storchaka in 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 Before Python initialization 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.)

"datetime.date.fromordinal()" and "datetime.date.fromtimestamp()" are
now up to 30% faster in the common case. (Contributed by Paul Ganssle
in bpo-32403.)

La función "os.fwalk()" es ahora 2 veces mas rápida gracias al uso de
"os.scandir()". (Contribuido por *Serhiy Storchaka* en bpo-25996.)

La rapidez de la función "shutil.rmtree()" se ha mejorado en un 20-40%
gracias al uso de la función "os.scandir()". (Contribuido por *Serhiy
Storchaka* en bpo-28564.)

Búsqueda y coincidencia optimizadas que no distinguen entre mayúsculas
y minúsculas de "expresiones regulares". La búsqueda de algunos
patrones ahora puede ser hasta 20 veces más rápida. (Contribuido por
*Serhiy Storchaka* en bpo-30285.)

"re.compile()" ahora convierte el parámetro "flags" en un objeto int
si es "RegexFlag". Ahora es tan rápido como Python 3.5 y más rápido
que Python 3.6 en aproximadamente un 10% dependiendo del patrón.
(Contribuido por *INADA Naoki* en bpo-31671.)

El método "modify()" de la clase "selectors.EpollSelector",
"selectors.PollSelector" y "selectors.DevpollSelector" puede ser
alrededor de un 10% más rápido bajo cargas pesadas. (Contribuido por
*Giampaolo Rodola* en bpo-30014)

El plegado constante se ha movido del optimizador de mirilla al nuevo
optimizador AST, que puede realizar optimizaciones de manera más
consistente. (Contribuid por *Eugene Toder* y *INADA Naoki* en
bpo-29469 y bpo-11549.)

La mayoría de funciones y métodos en "abc" se han reescrito en C. Esto
hace que la creación de clases base abstractas y la llamada a
"isinstance()" y "issubclass()" en ellas sean 1.5 veces más rápidas.
Esto también reduce el tiempo de inicio de Python hasta en un 10%.
(Contribuido por *Ivan Levkivskyi* y *INADA Naoki* en bpo-31333)

Mejoras significativas de velocidad para constructores alternativos
para "datetime.date" y "datetime.datetime" mediante el uso de
constructores de ruta rápida cuando no se construyen subclases.
(Contribuido por *Paul Ganssle* en bpo-32403)

La velocidad de comparación de instancias de "array.array" se ha
mejorado considerablemente en determinados casos. Ahora es de 10 a 70
veces más rápido cuando se comparan matrices que contienen valores del
mismo tipo de entero. (Contribuido por *Adrian Wielgosik* en
bpo-24700.)

Las funciones "math.erf()" y "math.erfc()" ahora use la implementación
de la biblioteca C (más rápida) en la mayoría de las plataformas.
(Contribuido por *Serhiy Storchaka* en bpo-26121.)


Otros cambios de implementación de CPython
==========================================

* Los ganchos de seguimiento ahora pueden optar por no recibir "line"
  y optar por recibir los eventos "opcode" del intérprete configurando
  los nuevos atributos "f_trace_lines" y "f_trace_opcodes"
  correspondientes en el marco que se está rastreando. (Contribuido
  por Nick Coghlan en bpo-31344).

* Se corrigieron algunos problemas de coherencia con los atributos del
  módulo del paquete de espacio de nombres. Los objetos del módulo de
  espacio de nombres ahora tienen un "__file__" que está configurado
  como "None" (previamente no configurado), y su "__spec__.origin"
  también está configurado como "None" (anteriormente la cadena
  ""namespace""). Ver bpo-32305. Además, el "__spec__.loader" del
  objeto del módulo de espacio de nombres se establece en el mismo
  valor que "__loader__" (anteriormente, el primero se estableció en
  "None"). Ver bpo-32303.

* El diccionario "locals()" ahora se muestra en el orden léxico en que
  se definieron las variables. Anteriormente, el orden no estaba
  definido. (Contribuido por *Raymond Hettinger* en bpo-32690.)

* El comando "distutils" "upload" ya no intenta cambiar los caracteres
  de fin de línea CR a CRLF. Esto soluciona un problema de corrupción
  con sdists que terminaban con un byte equivalente a CR. (Contribuido
  por Bo Bayles en bpo-32304).


Comportamiento obsoleto de Python
=================================

Las expresiones de rendimiento (tanto las cláusulas "yield" como las
cláusulas "yield from") ahora están en desuso en las comprensiones y
las expresiones generadoras (aparte de la expresión iterable en la
cláusula más a la izquierda "for"). Esto asegura que las comprensiones
siempre devuelvan inmediatamente un contenedor del tipo apropiado (en
lugar de potencialmente devolver un objeto *generator iterator*),
mientras que las expresiones generadoras no intentarán intercalar su
salida implícita con la salida de ninguna expresión de rendimiento
explícita. En Python 3.7, tales expresiones emiten
"DeprecationWarning" cuando se compilan, en Python 3.8 será un
"SyntaxError". (Contribuido por *Serhiy Storchaka* en bpo-10544.)

Devolviendo una subclase de "complex" desde "object.__complex__()"
está obsoleto y será un error en futuras versiones de Python. Esto
hace que "__complex__()" se compatible con "object.__int__()" y
"object.__float__()". (Contribuido por *Serhiy Storchaka* en
bpo-28894.)


Módulos, funciones y métodos de Python obsoletos
================================================


*aifc*
------

"aifc.openfp()" ha quedado obsoleto y se eliminará en Python 3.9.
Utilice "aifc.open()" en su lugar. (Contribuido por Brian Curtin en
bpo-31985).


*asyncio*
---------

Se ha desaprobado el soporte para instancias en "await" de
"asyncio.Lock" y otras primitivas de sincronización asyncio
directamente. Se debe utilizar un administrador de contexto
asincrónico para adquirir y liberar el recurso de sincronización.
(Contribuido por *Andrew Svetlov* en bpo-32253.)

Los métodos "asyncio.Task.current_task()" y "asyncio.Task.all_tasks()"
han quedado obsoletos. (Contribución de Andrew Svetlov en bpo-32250).


*collections*
-------------

En Python 3.8, las clases base abstractas en "collections.abc" ya no
estará expuesto en el módulo regular "collections". Esto ayudará a
crear una distinción más clara entre las clases concretas y las clases
base abstractas. (Contribuido por *Serhiy Storchaka* en bpo-25988.)


*dbm*
-----

"dbm.dumb" ahora admite la lectura de archivos de solo lectura y ya no
escribe el archivo de índice cuando no se cambia. Ahora se emite una
advertencia de obsolescencia si falta el archivo de índice y se recrea
en los modos "’r’" y "’w’" (esto será un error en futuras versiones de
Python). (Contribuido por *Serhiy Storchaka* en bpo-28847.)


*enum*
------

In Python 3.8, attempting to check for non-Enum objects in "Enum"
classes will raise a "TypeError" (e.g. "1 in Color"); similarly,
attempting to check for non-Flag objects in a "Flag" member will raise
"TypeError" (e.g. "1 in Perm.RW"); currently, both operations return
"False" instead. (Contributed by Ethan Furman in bpo-33217.)


*gettext*
---------

Usando un valor no entero para seleccionar una forma plural en
"gettext" ahora está en desuso. Nunca funcionó correctamente.
(Contribuido por *Serhiy Storchaka* en bpo-28692.)


*importlib*
-----------

Los métodos "MetaPathFinder.find_module()" (reemplazado por
"MetaPathFinder.find_spec()") y "PathEntryFinder.find_loader()"
(reemplazado por "PathEntryFinder.find_spec()"), ambos obsoletos en
Python 3.4, ahora emiten "DeprecationWarning". (Contribuido por
Matthias Bussonnier en bpo-29576).

The "importlib.abc.ResourceLoader" ABC has been deprecated in favour
of "importlib.abc.ResourceReader".


*locale*
--------

"locale.format()" has been deprecated, use "locale.format_string()"
instead.  (Contributed by Garvit in bpo-10379.)


*macpath*
---------

The "macpath" is now deprecated and will be removed in Python 3.8.
(Contributed by Chi Hsuan Yen in bpo-9850.)


*threading*
-----------

"dummy_threading" y "_dummy_thread" han quedado obsoletos. Ya no es
posible compilar Python con los subprocesos deshabilitados. Utilice
"threading" en su lugar. (Contribuido por Antoine Pitrou en
bpo-31370).


*socket*
--------

El truncamiento del valor del argumento silencioso en "socket.htons()"
y "socket.ntohs()" ha quedado en desuso. En futuras versiones de
Python, si el argumento pasado es mayor de 16 bits, se lanzará una
excepción. (Contribuido por *Oren Milman* en bpo-28332.)


*ssl*
-----

"ssl.wrap_socket()" is deprecated.  Use "ssl.SSLContext.wrap_socket()"
instead. (Contributed by Christian Heimes in bpo-28124.)


*sunau*
-------

"sunau.openfp()" ha quedado obsoleto y se eliminará en Python 3.9.
Utilice "sunau.open()" en su lugar. (Contribuido por Brian Curtin en
bpo-31985).


*sys*
-----

Deprecated "sys.set_coroutine_wrapper()" and
"sys.get_coroutine_wrapper()".

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()" has been deprecated and will be removed in Python 3.9.
Use "wave.open()" instead. (Contributed by Brian Curtin in bpo-31985.)


Funciones y tipos obsoletos de la API C
=======================================

Función "PySlice_GetIndicesEx()" está en desuso y se reemplaza con una
macro si "Py_LIMITED_API" no está configurado o configurado en un
valor en el rango entre "0x03050400" y "0x03060000" (no incluido), o
es "0x03060100" o superior. (Contribuido por *Serhiy Storchaka* en
bpo-27867.)

"PyOS_AfterFork()" ha quedado obsoleto. En su lugar usar
"PyOS_BeforeFork()", "PyOS_AfterFork_Parent()" o
"PyOS_AfterFork_Child()". (Contribuido por *Antoine Pitrou* en
bpo-16500.)


Eliminación de soporte de plataforma
====================================

* *FreeBSD* 9 y las versiones anteriores ya no son compatibles
  oficialmente.

* Para una compatibilidad total con Unicode, incluso dentro de los
  módulos de extensión, ahora se espera que las plataformas *nix
  proporcionen al menos uno de "C.UTF-8" (configuración regional
  completa), "C.utf8" (configuración regional completa) o "UTF-8"
  (configuración regional exclusiva de "LC_CTYPE") como una
  alternativa a la configuración regional "C" heredada basada en
  "ASCII".

* OpenSSL 0.9.8 y 1.0.1 ya no son compatibles, lo que significa que la
  compilación de CPython 3.7 con compatibilidad con SSL / TLS en
  plataformas más antiguas que aún usan estas versiones requiere
  opciones de compilación personalizadas que se vinculan a una versión
  más reciente de OpenSSL.

  En particular, este problema afecta a las distribuciones LTS Linux
  Debian 8 (también conocido como “jessie”) y *Ubuntu* 14.04 (también
  conocido como “Trusty”), ya que todavía usan OpenSSL 1.0.1 por
  defecto.

  Debian 9 (“stretch”) y *Ubuntu* 16.04 (“xenial”), así como las
  versiones recientes de otras versiones de LTS Linux (por ejemplo,
  RHEL / CentOS 7.5, SLES 12-SP3), usan OpenSSL 1.0.2 o posterior y
  siguen siendo compatibles en la configuración de compilación
  predeterminada.

  El propio CI configuration file de CPython proporciona un ejemplo
  del uso de SSL compatibility testing infrastructure en el conjunto
  de pruebas de CPython para crear y vincular OpenSSL 1.1.0 en lugar
  de un sistema obsoleto proporcionado por OpenSSL.


Eliminaciones de API y funciones
================================

Las siguientes funciones y API se han eliminado de Python 3.7:

* La función "os.stat_float_times()" ha sido removida. Se introdujo en
  Python 2.3 por compatibilidad con versiones anteriores de Python 2.2
  y quedó obsoleto desde Python 3.1.

* Los escapes desconocidos que consisten en "’\’" y una letra ASCII en
  las plantillas de reemplazo para "re.sub()" quedaron obsoletos en
  Python 3.5 y ahora causarán un error.

* Se eliminó el soporte del argumento * exclude * en
  "tarfile.TarFile.add()". Fue obsoleto en Python 2.7 y 3.2. Utilice
  el argumento * filtro * en su lugar.

* La función "ntpath.splitunc()" quedó obsoleta en Python 3.1 y ahora
  se ha eliminado. Utilice "splitdrive()" en su lugar.

* "collections.namedtuple()" ya no admite el parámetro *verbose* o el
  atributo "_source" que mostraba el código fuente generado para la
  clase de tupla nombrada. Esto fue parte de una optimización diseñada
  para acelerar la creación de clases. (Contribuido por *Jelle
  Zijlstra* con nuevas mejoras de *INADA Naoki*, *Serhiy Storchaka*, y
  *Raymond Hettinger* en bpo-28638.)

* Funciones "bool()", "float()", "list()" y "tuple()" ya no aceptan
  argumentos de palabras clave. El primer argumento de "int()" ahora
  solo se puede pasar como argumento posicional.

* Removed previously deprecated in Python 2.4 classes "Plist", "Dict"
  and "_InternalDict" in the "plistlib" module.  Dict values in the
  result of functions "readPlist()" and "readPlistFromBytes()" are now
  normal dicts.  You no longer can use attribute access to access
  items of these dictionaries.

* La función "asyncio.windows_utils.socketpair()" ha sido removida. En
  su lugar use la función "socket.socketpair()", está disponible en
  todas las plataformas desde Python 3.5.
  "asyncio.windows_utils.socketpair" era un alias para
  "socket.socketpair" en Python 3.5 y mas nuevo.

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

* Direct instantiation of "ssl.SSLSocket" and "ssl.SSLObject" objects
  is now prohibited. The constructors were never documented, tested,
  or designed as public constructors.  Users were supposed to use
  "ssl.wrap_socket()" or "ssl.SSLContext". (Contributed by Christian
  Heimes in bpo-32951.)

* Se ha eliminado el comando "distutils" "install_misc" no utilizado.
  (Contribuido por Eric N. Vander Weele en bpo-29218).


Eliminaciones de módulos
========================

El modulo "fpectl" ha sido removido. Nunca se habilitó de forma
predeterminada, nunca funcionó correctamente en x86-64 y cambió la ABI
de Python de manera que causó la rotura inesperada de las extensiones
C. (Contribuido por *Nathaniel J. Smith* en bpo-29137.)


Cambios solo en Windows
=======================

El lanzador de python, (py.exe), puede aceptar especificadores de 32 y
64 bits **sin** tener que especificar también una versión secundaria.
Entonces, "py -3-32" y "py -3-64" se vuelven válidos, así como "py
-3.7-32", también los -*m*-64 and -*m.n*-64. Los formularios ahora se
aceptan para forzar Python de 64 bits incluso si de otro modo se
hubieran utilizado 32 bits. Si la versión especificada no está
disponible, py.exe saldrá del error. (Contribuido por *Steve Barnes*
en bpo-30291.)

El lanzador se puede ejecutar como "py -0" para producir una lista de
las pitones instaladas, *con las marcas predeterminadas con un
asterisco*. La ejecución de "py -0p" incluirá las rutas. Si py se
ejecuta con un especificador de versión que no puede coincidir,
también imprimirá la *forma corta* lista de especificadores
disponibles. (Contribuido por *Steve Barnes* en bpo-30362.)


Portando a Python 3.7
=====================

Esta sección enumera los cambios descritos anteriormente y otras
correcciones de errores que pueden requerir cambios en su código.


Cambios en el comportamiento de Python
--------------------------------------

* "async" y "await" los nombres ahora son palabras clave reservadas.
  El código que usa estos nombres como identificadores lanzará ahora
  un "SyntaxError". (Contribuido por *Jelle Zijlstra* en bpo-30406.)

* **PEP 479** está habilitado para todo el código en Python 3.7, lo
  que significa que las excepciones de "StopIteration" generadas
  directa o indirectamente en corutinas y generadores se transforman
  en excepciones de "RuntimeError". (Contribuido por *Yury Selivanov*
  en bpo-32670.)

* Los métodos "object.__aiter__()" ya no se pueden declarar cómo
  asincrónicos. (Contribuido por *Yury Selivanov* en bpo-31709.)

* Debido a un descuido, las versiones anteriores de Python aceptaron
  erróneamente la siguiente sintaxis:

     f(1 for x in [1],)

     class C(1 for x in [1]):
         pass

  Python 3.7 ahora lanza correctamente una "SyntaxError", como una
  expresión generadora siempre debe estar directamente dentro de un
  conjunto de paréntesis y no puede tener una coma a ambos lados, y la
  duplicación de los paréntesis solo se puede omitir en las llamadas.
  (Contribuido por *Serhiy Storchaka* en bpo-32012 y bpo-32023.)

* Al usar el interruptor "-m", el directorio de trabajo inicial ahora
  se agrega a: data "sys.path", en lugar de una cadena vacía (que
  denota dinámicamente el directorio de trabajo actual en el momento
  de cada importación). Cualquier programa que esté comprobando la
  cadena vacía, o que dependa de otro modo del comportamiento
  anterior, deberá actualizarse en consecuencia (por ejemplo,
  comprobando también si hay "os.getcwd()" o
  "os.path.dirname(__main__.__file__)", dependiendo de por qué el
  código buscaba la cadena vacía en primer lugar).


Cambios en la API Python
------------------------

* "socketserver.ThreadingMixIn.server_close" now waits until all non-
  daemon threads complete.  Set the new
  "socketserver.ThreadingMixIn.block_on_close" class attribute to
  "False" to get the pre-3.7 behaviour. (Contributed by Victor Stinner
  in bpo-31233 and bpo-33540.)

* "socketserver.ForkingMixIn.server_close" now waits until all child
  processes complete. Set the new
  "socketserver.ForkingMixIn.block_on_close" class attribute to
  "False" to get the pre-3.7 behaviour. (Contributed by Victor Stinner
  in bpo-31151 and bpo-33540.)

* La función "locale.localeconv()" ahora establece temporalmente la
  configuración regional "LC_CTYPE" en el valor de "`LC_NUMERIC" en
  algunos casos. (Contribuido por *Victor Stinner* en bpo-31900.)

* "pkgutil.walk_packages()" ahora genera un "ValueError" si la* ruta *
  es una cadena. Anteriormente se devolvió una lista vacía.
  (Contribuido por *Sanyam Khurana* en bpo-24744.)

* Un argumento de cadena de formato para "string.Formatter.format()"
  es ahora solo posicional. Pasarlo como un argumento de palabra clave
  quedó obsoleto en Python 3.5. (Contribuido por *Serhiy Storchaka* en
  bpo-29193.)

* Atributos "key", "value" y "coded_value" de la clase
  "http.cookies.Morsel" ahora son de solo lectura. La asignación a
  ellos quedó obsoleta en Python 3.5. Utilizar el método "set()" para
  configurarlos. (Contribuido por *Serhiy Storchaka* en bpo-29192.)

* El argumento *mode* de "os.makedirs()" ya no afecta los bits de
  permiso de archivo de los directorios de nivel intermedio recién
  creados. Para configurar sus bits de permiso de archivo, puede
  configurar umask antes de invocar "makedirs()". (Aportado por Serhiy
  Storchaka en bpo-19930.)

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

* "cgi.parse_multipart()" ahora acepta los argumentos *encoding* y
  *errors* y devuelve los mismos resultados que "FieldStorage": para
  los campos que no son archivos, el valor asociado a una clave es una
  lista de cadenas, no bytes. (Contribuido por Pierre Quentel en
  bpo-29979).

* Debido a cambios internos en "socket", llamar "socket.fromshare()"
  en un socket creado por "socket.share" en versiones anteriores de
  Python no es compatible.

* "repr" para "BaseException" ha cambiado para no incluir la coma
  final. La mayoría de las excepciones se ven afectadas por este
  cambio. (Contribuido por *Serhiy Storchaka* en bpo-30399.)

* "repr" para "datetime.timedelta" ha cambiado para incluir los
  argumentos de palabras clave en la salida. (Contribuido por *Utkarsh
  Upadhyay* en bpo-30302.)

* Debido a que "shutil.rmtree()" ahora se implementa usando la función
  "os.scandir()", el controlador especificado por el usuario *onerror*
  ahora se llama con el primer argumento "os.scandir" en lugar de
  "os.listdir" cuando falla el listado del directorio.

* Es posible que en el futuro se agregue soporte para conjuntos
  anidados y operaciones de conjuntos en expresiones regulares como en
  Unicode Technical Standard #18. Esto cambiaría la sintaxis. Para
  facilitar este cambio futuro, por el momento, se planteará un
  "FutureWarning" en casos ambiguos. Que incluyen conjuntos que
  comienzan con un literal "’[‘" o que contienen secuencias de
  caracteres literales "’—‘", "’&&’", "’~~’", and "’||’". Para evitar
  una advertencia, escapa de ellos con una barra invertida.
  (Contribuido por *Serhiy Storchaka* en bpo-30349.)

* El resultado de dividir una cuerda en un "expresión regular" que
  podría coincidir con una cadena vacía. Por ejemplo, dividir en
  "r’\s*’" ahora dividirá no solo en espacios en blanco como lo hizo
  anteriormente, sino también en cadenas vacías antes de todos los
  caracteres que no sean espacios en blanco y justo antes del final de
  la cadena. El comportamiento anterior se puede restaurar cambiando
  el patrón a "r’\s+’". Una "FutureWarning" se emitió para tales
  patrones desde Python 3.5.

  Para patrones que coinciden con cadenas vacías y no vacías, el
  resultado de la búsqueda de todas las coincidencias también puede
  cambiarse en otros casos. Por ejemplo en la cadena "'a\n\n'", el
  patrón "’\n'" no solo coincidirá con cadenas vacías en las
  posiciones 2 y 3, sino también la cadena "'\n'" en las posiciones
  2–3. Para hacer coincidir solo líneas en blanco, el patrón debe
  reescribirse como "r'(?m)^[^\S\n]*$'".

  "re.sub()" ahora reemplaza las coincidencias vacías adyacentes a una
  coincidencia no vacía anterior. Por ejemplo, "re.sub('x*', '-',
  'abxd')" ahora devuelve "'-a-b--d-'" en lugar de "'-a-b-d-'" (el
  primer signo menos entre 'b' y 'd' reemplaza a 'x', y el segundo
  signo menos reemplaza a una cadena vacía entre 'x' y 'd').

  (Contribuido por *Serhiy Storchaka* en bpo-25054 y bpo-32308.)

* Cambie "re.escape()" para escapar solo de los caracteres especiales
  regex en lugar de escapar de todos los caracteres que no sean letras
  ASCII, números y "’_’". (Contribuido por *Serhiy Storchaka* en
  bpo-29995.)

* Los marcos "tracemalloc.Traceback" ahora se ordenan del más antiguo
  al más reciente para ser más coherentes con "traceback".
  (Contribuido por *Jesse Bakker* en bpo-32121.)

* En sistemas operativos que admiten banderas de bits
  "socket.SOCK_NONBLOCK" o "socket.SOCK_CLOEXEC", el "socket.type" ya
  no los tiene aplicados. Por lo tanto, comprobaciones como "if
  sock.type == socket.SOCK_STREAM" funcionan como se espera en todas
  las plataformas. (Contribuido por *Yury Selivanov* en bpo-32331.)

* En Windows, el valor predeterminado para el argumento *close_fds* de
  "subprocess.Popen" se cambió de "False" a "True" al redirigir los
  identificadores estándar. Si anteriormente dependía de que los
  identificadores fueran heredados al usar "subprocess.Popen" con la
  redirección estándar de io, tendrá que pasar "close_fds=False" para
  preservar el comportamiento anterior, o usar
  "STARTUPINFO.lpAttributeList".

* "importlib.machinery.PathFinder.invalidate_caches()" -- que afecta
  implícitamente a "importlib.invalidate_caches()" -- ahora borra
  entradas en "sys.path_importer_cache" que están configuradas en
  "None". (Contribuido por *Brett Cannon* en bpo-33169.)

* En "asyncio", "loop.sock_recv()", "loop.sock_sendall()",
  "loop.sock_accept()", "loop.getaddrinfo()", "loop.getnameinfo()" se
  han cambiado para que sean métodos de rutina adecuados para que
  coincidan con su documentación. Anteriormente, estos métodos
  devolvían instancias "asyncio.Future". (Contribuido por *Yury
  Selivanov* en bpo-32327.)

* "asyncio.Server.sockets" ahora devuelve una copia de la lista
  interna de sockets del servidor, en lugar de devolverla
  directamente. (Contribuido por *Yury Selivanov* en bpo-32662.)

* "Struct.format" es ahora una instancia "str" en lugar de una
  instancia "bytes". (Contribuido por *Victor Stinner* en bpo-21071.)

* "argparse" *subparsers* ahora pueden hacerse obligatorios pasando
  "required=True" a "ArgumentParser.add_subparsers()". (Contribuido
  por *Anthony Sottile* en bpo-26510.)

* El sistema "ast.literal_eval()" es ahora más estricto. Ya no se
  permite la suma ni la resta de números arbitrarios. (Contribuido por
  Serhiy Storchaka en bpo-31778).

* "Calendar.itermonthdates" ahora lanzará una excepción cuando una
  fecha cae fuera del rango de "0001-01-01" a "9999-12-31". Para
  admitir aplicaciones que no pueden tolerar tales excepciones, se
  puede utilizar el nuevo "Calendar.itermonthdays3" y
  "Calendar.itermonthdays4". Los nuevos métodos devuelven tuplas y no
  están restringidos por el rango admitido por "datetime.date".
  (Contribuido por *Alexander Belopolsky* en bpo-28292.)

* "collections.ChainMap" ahora conserva el orden de las asignaciones
  subyacentes. (Contribuido por *Raymond Hettinger* en bpo-32792.)

* El método "submit()" de "concurrent.futures.ThreadPoolExecutor" y
  "concurrent.futures.ProcessPoolExecutor" ahora genera un
  "RuntimeError" si se llama durante el cierre del intérprete.
  (Contribuido por *Mark Nemec* en bpo-33097.)

* El constructor "configparser.ConfigParser" ahora usa "read_dict()"
  para procesar los valores predeterminados, haciendo que su
  comportamiento sea coherente con el resto del analizador. Las claves
  y los valores que no son cadenas en el diccionario de valores
  predeterminados ahora se están convirtiendo implícitamente en
  cadenas. (Contribuido por *James Tocknell* en bpo-23835.)

* Se eliminaron varias importaciones internas indocumentadas. Un
  ejemplo es que "os.errno" ya no está disponible; use "import errno"
  directamente en su lugar. Tenga en cuenta que estas importaciones
  internas no documentadas pueden eliminarse en cualquier momento sin
  previo aviso, incluso en las versiones micro.


Cambios en la API de C
----------------------

La función "PySlice_GetIndicesEx()" se considera insegura para
secuencias de tamaño variable. Si los índices de corte no son
instancias de "int", sino objetos que implementan el método
"__index__()", la secuencia se puede cambiar de tamaño después de
pasar su longitud a "PySlice_GetIndicesEx()". Esto puede llevar a que
se devuelvan índices fuera de la longitud de la secuencia. Esto puede
llevar a devolver índices fuera de la longitud de la secuencia. Para
evitar posibles problemas, use las nuevas funciones "PySlice_Unpack()"
y "PySlice_AdjustIndices()". (Contribuido por *Serhiy Storchaka* en
bpo-27867.)


Cambios en el código de bytes de CPython
----------------------------------------

There are two new opcodes: "LOAD_METHOD" and "CALL_METHOD".
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)

The "STORE_ANNOTATION" opcode has been removed. (Contributed by Mark
Shannon in bpo-32550.)


Cambios solo en Windows
-----------------------

El archivo utilizado para anular "sys.path" ahora se llama "<python-
executable>._pth" en lugar de "'sys.path'". Consulte Encontrar módulos
para obtener más información. (Aportado por Steve Dower en bpo-28137.)


Otra implementación de cambios en CPython
-----------------------------------------

En preparación para posibles cambios futuros en la API pública de
inicialización del tiempo de ejecución de CPython (ver **PEP 432**
para un borrador inicial, pero algo desactualizado), La lógica de
gestión de configuración y puesta en marcha interna de CPython se ha
re-factorizado significativamente. Si bien estas actualizaciones están
destinadas a ser completamente transparentes tanto para las
aplicaciones integradas como para los usuarios de la CLI de CPython
normal, se mencionan aquí ya que la refactorización cambia el orden
interno de varias operaciones durante el inicio del intérprete y, por
lo tanto, pueden descubrir defectos previamente latentes, ya sea en
aplicaciones incrustadas, o en el propio CPython. ( Inicialmente
contribuido por *Nick Coghlan* y *Eric Snow* como parte de bpo-22257,
y actualizado por *Nick*, *Eric*, y *Victor Stinner* en varios otros
números). Algunos detalles conocidos afectados:

* Actualmente, las aplicaciones integradas no pueden utilizar
  "PySys_AddWarnOptionUnicode()" debido al requisito de crear un
  objeto Unicode antes de llamar a "Py_Initialize". Utilice
  "PySys_AddWarnOption()" en su lugar.

* Los filtros de advertencias agregados por una aplicación de
  incrustación con "PySys_AddWarnOption()" ahora deberían tener
  prioridad de manera más consistente sobre los filtros
  predeterminados establecidos por el intérprete

Debido a cambios en la forma en que se configuran los filtros de
advertencias predeterminados, establecer "Py_BytesWarningFlag" en un
valor mayor que uno ya no es suficiente para que ambos emitan mensajes
"BytesWarning" y los conviertan en excepciones. En su lugar, se debe
establecer la bandera (para hacer que las advertencias se emitan en
primer lugar) y se debe agregar un filtro de advertencias explícito
"error::BytesWarning" para convertirlas en excepciones.

Debido a un cambio en la forma en que el compilador maneja las cadenas
de documentos, el implícito "return None" en el cuerpo de una función
que consiste únicamente en una cadena de documentos ahora se marca
como ocurriendo en la misma línea que la cadena de documentos, no en
la línea de encabezado de la función.

El estado de excepción actual se ha movido del objeto de trama a la
co-rutina. Esto simplificó el intérprete y corrigió un par de errores
oscuros causados por tener un estado de excepción de intercambio al
ingresar o salir de un generador. (Contribuido por *Mark Shannon* en
bpo-25612.)


Cambios notables en Python 3.7.1
================================

A partir de 3.7.1, "Py_Initialize()" ahora lee y respeta
constantemente todos los mismos ajustes de entorno que "Py_Main()" (en
versiones anteriores de Python, respetaba un subconjunto mal definido
de esas variables de entorno, mientras que en Python 3.7.0 no leyó
ninguna de ellas debido a bpo-34247). Si este comportamiento no es
deseado, establezca "Py_IgnoreEnvironmentFlag" en 1 antes de llamar a
"Py_Initialize()".

En 3.7.1 la API C para las variables de Contexto ha sido actualizada
para usar punteros "PyObject". Ver también bpo-34762.

En 3.7.1 el módulo "tokenize" ahora emite un token "NEWLINE" cuando se
le proporciona una entrada que no tiene una nueva línea al final. Este
comportamiento ahora coincide con lo que hace el tokenizador C
internamente. (Contribuido por *Ammar Askar* en bpo-33899.)


Cambios notables en Python 3.7.2
================================

En 3.7.2, "venv" en Windows ya no copia los binarios originales, sino
que crea scripts de redireccionamiento llamados "python.exe" y
"pythonw.exe" en su lugar. Esto resuelve un problema de larga data en
el que todos los entornos virtuales tendrían que actualizarse o
recrearse con cada actualización de Python. Sin embargo, tenga en
cuenta que esta versión aún requerirá la recreación de entornos
virtuales para obtener los nuevos scripts.


Cambios notables en Python 3.7.6
================================

Debido a importantes problemas de seguridad, el parámetro
*reuse_address* de "asyncio.loop.create_datagram_endpoint()" ya no es
compatible. Esto se debe al comportamiento de la opción socket
"SO_REUSEADDR" en UDP. Para obtener más detalles, consulte la
documentación de "loop.create_datagram_endpoint()". (Contribuido por
*Kyle Stanley*, *Antoine Pitrou*, y *Yury Selivanov* en bpo-37228.)


Cambios notables en Python 3.7.10
=================================

Las versiones anteriores de Python permitían utilizar tanto ";" como
"&" como separadores de parámetros de consulta en
"urllib.parse.parse_qs()" y "urllib.parse.parse_qsl()". Por cuestiones
de seguridad y para cumplir con las recomendaciones más recientes del
W3C, esto se ha modificado para permitir solo una clave separadora,
con "&" como valor predeterminado. Este cambio también afecta a
"cgi.parse()" y "cgi.parse_multipart()", ya que utilizan las funciones
afectadas internamente. Para obtener más detalles, consulte su
documentación respectiva. (Contribuido por Adam Goldschmidt, Senthil
Kumaran y Ken Jin en bpo-42967).


Cambios notables en Python 3.7.11
=================================

Una corrección de seguridad modifica el comportamiento de "ftplib.FTP"
para que no confíe en la dirección IPv4 enviada desde el servidor
remoto al configurar un canal de datos pasivo. En su lugar,
reutilizamos la dirección IP del servidor FTP. Para el código inusual
que requiere el comportamiento anterior, configure un atributo
"trust_server_pasv_ipv4_address" en su instancia FTP en "True".
(Consulte gh-87451)

La presencia de caracteres de nueva línea o de tabulación en partes de
una URL permite algunas formas de ataques. Siguiendo la especificación
WHATWG que actualiza RFC 3986, el analizador "urllib.parse()" elimina
de la URL los caracteres de nueva línea ASCII "\n", "\r" y de
tabulación "\t" para evitar este tipo de ataques. Los caracteres
eliminados se controlan mediante una nueva variable de nivel de módulo
"urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE". (Véase gh-88048)


Cambios notables en Python 3.7.14
=================================

La conversión entre "int" y "str" en bases distintas de 2 (binario),
4, 8 (octal), 16 (hexadecimal) o 32, como la base 10 (decimal), ahora
genera un error "ValueError" si la cantidad de dígitos en formato de
cadena supera un límite para evitar posibles ataques de denegación de
servicio debido a la complejidad algorítmica. Esta es una mitigación
para **CVE 2020-10735**. Este límite se puede configurar o
deshabilitar mediante una variable de entorno, un indicador de línea
de comandos o las API de "sys". Consulte la documentación de integer
string conversion length limitation. El límite predeterminado es de
4300 dígitos en formato de cadena.
