Novedades de Python 3.6
***********************

Editors:
   Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov
   <yury@magic.io>

Este artículo explica las nuevas funciones de Python 3.6, en
comparación con 3.5. Python 3.6 se lanzó el 23 de diciembre de 2016.
Consulte el changelog para obtener una lista completa de cambios.

Ver también: **PEP 494** - Programa de lanzamiento de Python 3.6


Resumen: aspectos destacados de la versión
==========================================

Nuevas funciones de sintaxis:

* PEP 498, literales de cadena formateados.

* PEP 515, guiones bajos en literales numéricos.

* PEP 526, sintaxis para anotaciones variables.

* PEP 525, generadores asincrónicos.

* PEP 530: comprensiones asincrónicas.

Nuevos módulos de biblioteca:

* "secrets": PEP 506 -- Adding A Secrets Module To The Standard
  Library.

Mejoras en la implementación de CPython:

* El tipo dict se ha vuelto a implementar para utilizar un more
  compact representation basado en a proposal by Raymond Hettinger y
  similar al PyPy dict implementation. Esto dio como resultado que los
  diccionarios usaran entre un 20% y un 25% menos de memoria en
  comparación con Python 3.5.

* La personalización de la creación de clases se ha simplificado con
  el new protocol.

* El orden de definición de atributo de clase es now preserved.

* El orden de los elementos en "**kwargs" ahora corresponds to the
  order en el que se pasaron argumentos de palabras clave a la
  función.

* Se han agregado DTrace y SystemTap probing support.

* La nueva variable de entorno PYTHONMALLOC ahora se puede utilizar
  para depurar la asignación de memoria del intérprete y los errores
  de acceso.

Mejoras significativas en la biblioteca estándar:

* El módulo "asyncio" ha recibido nuevas funciones, mejoras
  significativas de rendimiento y usabilidad, y una buena cantidad de
  correcciones de errores. A partir de Python 3.6, el módulo "asyncio"
  ya no es provisional y su API se considera estable.

* Se ha implementado un nuevo file system path protocol para admitir
  *path-like objects*. Todas las funciones de biblioteca estándar que
  operan en rutas se han actualizado para trabajar con el nuevo
  protocolo.

* El módulo "datetime" ha ganado soporte para Local Time
  Disambiguation.

* El módulo "typing" recibió varios improvements.

* El módulo "tracemalloc" se ha rediseñado significativamente y ahora
  se utiliza para proporcionar una mejor salida para
  "ResourceWarning", así como para proporcionar un mejor diagnóstico
  de errores de asignación de memoria. Consulte PYTHONMALLOC section
  para obtener más información.

Mejoras de seguridad:

* Se ha agregado el nuevo módulo "secrets" para simplificar la
  generación de números pseudoaleatorios criptográficamente fuertes
  adecuados para administrar secretos como autenticación de cuentas,
  tokens y similares.

* En Linux, "os.urandom()" ahora se bloquea hasta que se inicializa el
  grupo de entropía aleatoria del sistema para aumentar la seguridad.
  Consulte el **PEP 524** para conocer la justificación.

* Los módulos "hashlib" y "ssl" ahora son compatibles con OpenSSL
  1.1.0.

* Se han mejorado la configuración predeterminada y el conjunto de
  funciones del módulo "ssl".

* El módulo "hashlib" recibió soporte para los algoritmos hash BLAKE2,
  SHA-3 y SHAKE y la función de derivación de claves "scrypt()".

Mejoras de Windows:

* PEP 528 y PEP 529, el sistema de archivos de Windows y la
  codificación de la consola cambiaron a UTF-8.

* El lanzador "py.exe", cuando se usa de forma interactiva, ya no
  prefiere Python 2 sobre Python 3 cuando el usuario no especifica una
  versión (a través de argumentos de línea de comando o un archivo de
  configuración). El manejo de las líneas shebang permanece sin
  cambios - "python" se refiere a Python 2 en ese caso.

* "python.exe" y "pythonw.exe" se han marcado como con reconocimiento
  de ruta larga, lo que significa que es posible que ya no se aplique
  el límite de ruta de 260 caracteres. Consulte removing the MAX_PATH
  limitation para obtener más detalles.

* Se puede agregar un archivo "._pth" para forzar el modo aislado y
  especificar completamente todas las rutas de búsqueda para evitar
  búsquedas en el registro y el entorno. Consulte the documentation
  para obtener más información.

* Un archivo "python36.zip" ahora funciona como un punto de referencia
  para inferir "PYTHONHOME". Consulte the documentation para obtener
  más información.


Nuevas características
======================


PEP 498: Literales de cadena formateados
----------------------------------------

**PEP 498** introduce un nuevo tipo de cadenas literales: *f-strings*
o formatted string literals.

Los literales de cadena formateados tienen el prefijo "'f'" y son
similares a las cadenas de formato aceptadas por "str.format()".
Contienen campos de reemplazo rodeados por llaves. Los campos de
reemplazo son expresiones, que se evalúan en tiempo de ejecución y
luego se formatean usando el protocolo "format()":

   >>> name = "Fred"
   >>> f"He said his name is {name}."
   'He said his name is Fred.'
   >>> width = 10
   >>> precision = 4
   >>> value = decimal.Decimal("12.34567")
   >>> f"result: {value:{width}.{precision}}"  # nested fields
   'result:      12.35'

Ver también:

  **PEP 498** - Interpolación de cadenas literal.
     PEP escrito e implementado por Eric V. Smith.

  Feature documentation.


PEP 526: Sintaxis para anotaciones de variables
-----------------------------------------------

**PEP 484** introdujo el estándar para anotaciones de tipo de
parámetros de función, también conocido como sugerencias de tipo. Este
PEP agrega sintaxis a Python para anotar los tipos de variables,
incluidas las variables de clase y las variables de instancia:

   primes: List[int] = []

   captain: str  # Note: no initial value!

   class Starship:
       stats: Dict[str, int] = {}

Al igual que para las anotaciones de funciones, el intérprete de
Python no asigna ningún significado particular a las anotaciones de
variables y solo las almacena en el atributo "__annotations__" de una
clase o módulo.

A diferencia de las declaraciones de variables en lenguajes tipados
estáticamente, el objetivo de la sintaxis de anotación es proporcionar
una manera fácil de especificar metadatos de tipo estructurado para
herramientas y bibliotecas de terceros a través del árbol de sintaxis
abstracta y el atributo "__annotations__".

Ver también:

  **PEP 526**: sintaxis para anotaciones de variables.
     PEP escrito por Ryan Gonzalez, Philip House, Ivan Levkivskyi,
     Lisa Roach y Guido van Rossum. Implementado por Ivan Levkivskyi.

  Herramientas que utilizan o utilizarán la nueva sintaxis: mypy,
  pytype, PyCharm, etc.


PEP 515: subrayados en literales numéricos
------------------------------------------

**PEP 515** agrega la capacidad de usar guiones bajos en literales
numéricos para mejorar la legibilidad. Por ejemplo:

   >>> 1_000_000_000_000_000
   1000000000000000
   >>> 0x_FF_FF_FF_FF
   4294967295

Se permiten guiones bajos simples entre dígitos y después de cualquier
especificador de base. No se permiten guiones bajos al principio, al
final o múltiples en una fila.

El lenguaje string formatting ahora también tiene soporte para la
opción "'_'" para señalar el uso de un guión bajo para un separador de
miles para los tipos de presentación de punto flotante y para el tipo
de presentación de enteros "'d'". Para los tipos de presentación de
enteros "'b'", "'o'", "'x'" y "'X'", se insertarán guiones bajos cada
4 dígitos:

   >>> '{:_}'.format(1000000)
   '1_000_000'
   >>> '{:_x}'.format(0xFFFFFFFF)
   'ffff_ffff'

Ver también:

  **PEP 515** - Guiones bajos en literales numéricos
     PEP escrito por Georg Brandl y Serhiy Storchaka.


PEP 525: Generadores asíncronos
-------------------------------

**PEP 492** introdujo soporte para corrutinas nativas y sintaxis
"async" / "await" para Python 3.5. Una limitación notable de la
implementación de Python 3.5 es que no fue posible usar "await" y
"yield" en el mismo cuerpo de función. En Python 3.6 se eliminó esta
restricción, lo que permite definir *asynchronous generators*

   async def ticker(delay, to):
       """Yield numbers from 0 to *to* every *delay* seconds."""
       for i in range(to):
           yield i
           await asyncio.sleep(delay)

La nueva sintaxis permite un código más rápido y conciso.

Ver también:

  **PEP 525** - Generadores asincrónicos
     PEP escrito e implementado por Yury Selivanov.


PEP 530: Comprensiones asincrónicas
-----------------------------------

**PEP 530** agrega soporte para usar "async for" en listas, conjuntos,
dict comprensiones y expresiones generadoras:

   result = [i async for i in aiter() if i % 2]

Además, las expresiones "await" son compatibles con todo tipo de
comprensiones:

   result = [await fun() for fun in funcs if await condition()]

Ver también:

  **PEP 530** - Comprensiones asincrónicas
     PEP escrito e implementado por Yury Selivanov.


PEP 487: personalización más sencilla de la creación de clases
--------------------------------------------------------------

Ahora es posible personalizar la creación de subclases sin utilizar
una metaclase. El nuevo método de clase "__init_subclass__" se llamará
en la clase base siempre que se cree una nueva subclase:

   class PluginBase:
       subclasses = []

       def __init_subclass__(cls, **kwargs):
           super().__init_subclass__(**kwargs)
           cls.subclasses.append(cls)

   class Plugin1(PluginBase):
       pass

   class Plugin2(PluginBase):
       pass

Para permitir que las llamadas "super()" sin argumentos funcionen
correctamente desde las implementaciones "__init_subclass__()", las
metaclases personalizadas deben garantizar que la nueva entrada del
espacio de nombres "__classcell__" se propague a "type.__new__" (como
se describe en Creando el objeto de clase).

Ver también:

  **PEP 487**: personalización más sencilla de la creación de clases
     PEP escrito e implementado por Martin Teichmann.

  Feature documentation


PEP 487: Mejoras en el protocolo descriptor
-------------------------------------------

**PEP 487** amplía el protocolo descriptor para incluir el nuevo
método opcional "__set_name__()". Siempre que se defina una nueva
clase, se llamará al nuevo método en todos los descriptores incluidos
en la definición, proporcionándoles una referencia a la clase que se
está definiendo y el nombre dado al descriptor dentro del espacio de
nombres de la clase. En otras palabras, las instancias de descriptores
ahora pueden conocer el nombre de atributo del descriptor en la clase
propietaria:

   class IntField:
       def __get__(self, instance, owner):
           return instance.__dict__[self.name]

       def __set__(self, instance, value):
           if not isinstance(value, int):
               raise ValueError(f'expecting integer in {self.name}')
           instance.__dict__[self.name] = value

       # this is the new initializer:
       def __set_name__(self, owner, name):
           self.name = name

   class Model:
       int_field = IntField()

Ver también:

  **PEP 487**: personalización más sencilla de la creación de clases
     PEP escrito e implementado por Martin Teichmann.

  Feature documentation


PEP 519: Agregar un protocolo de ruta del sistema de archivos
-------------------------------------------------------------

Históricamente, las rutas del sistema de archivos se han representado
como objetos "str" o "bytes". Esto ha llevado a las personas que
escriben códigos que operan en las rutas del sistema de archivos a
asumir que dichos objetos son solo uno de esos dos tipos (un "int" que
representa un descriptor de archivo no cuenta, ya que no es una ruta
de archivo). Desafortunadamente, esa suposición evita que las
representaciones de objetos alternativos de las rutas del sistema de
archivos como "pathlib" funcionen con código preexistente, incluida la
biblioteca estándar de Python.

Para solucionar esta situación, se ha definido una nueva interfaz
representada por "os.PathLike". Al implementar el método
"__fspath__()", un objeto indica que representa una ruta. Entonces, un
objeto puede proporcionar una representación de bajo nivel de una ruta
del sistema de archivos como un objeto "str" o "bytes". Esto significa
que un objeto se considera *path-like* si implementa "os.PathLike" o
es un objeto "str" o "bytes" que representa una ruta del sistema de
archivos. El código puede usar "os.fspath()", "os.fsdecode()" o
"os.fsencode()" para obtener explícitamente una representación "str" y
/ o "bytes" de un objeto similar a una ruta.

La función "open()" incorporada se ha actualizado para aceptar objetos
"os.PathLike", al igual que todas las funciones relevantes en los
módulos "os" y "os.path", y la mayoría de las otras funciones y clases
en la biblioteca estándar. La clase "os.DirEntry" y las clases
relevantes en "pathlib" también se han actualizado para implementar
"os.PathLike".

La esperanza es que la actualización de las funciones fundamentales
para operar en las rutas del sistema de archivos conducirá a un código
de terceros para admitir implícitamente todos los *path-like objects*
sin ningún cambio de código, o al menos muy mínimos (por ejemplo,
llamar a "os.fspath()" al comienzo del código antes de operar en un
objeto similar a una ruta).

A continuación, se muestran algunos ejemplos de cómo la nueva interfaz
permite que "pathlib.Path" se utilice de manera más fácil y
transparente con código preexistente:

   >>> import pathlib
   >>> with open(pathlib.Path("README")) as f:
   ...     contents = f.read()
   ...
   >>> import os.path
   >>> os.path.splitext(pathlib.Path("some_file.txt"))
   ('some_file', '.txt')
   >>> os.path.join("/a/b", pathlib.Path("c"))
   '/a/b/c'
   >>> import os
   >>> os.fspath(pathlib.Path("some_file.txt"))
   'some_file.txt'

(Implementado por Brett Cannon, Ethan Furman, Dusty Phillips y Jelle
Zijlstra).

Ver también:

  **PEP 519**: adición de un protocolo de ruta del sistema de archivos
     PEP escrito por Brett Cannon y Koos Zevenhoven.


PEP 495: desambiguación de la hora local
----------------------------------------

En la mayoría de las ubicaciones del mundo, ha habido y habrá
ocasiones en las que los relojes locales se retrasaron. En esos
horarios, se introducen intervalos en los que los relojes locales
marcan la misma hora dos veces en el mismo día. En estas situaciones,
la información mostrada en un reloj local (o almacenada en una
instancia de fecha y hora de Python) es insuficiente para identificar
un momento particular en el tiempo.

**PEP 495** agrega el nuevo atributo *fold* a las instancias de las
clases "datetime.datetime" y "datetime.time" para diferenciar entre
dos momentos en el tiempo en los que las horas locales son las mismas:

   >>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
   >>> for i in range(4):
   ...     u = u0 + i*HOUR
   ...     t = u.astimezone(Eastern)
   ...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
   ...
   04:00:00 UTC = 00:00:00 EDT 0
   05:00:00 UTC = 01:00:00 EDT 0
   06:00:00 UTC = 01:00:00 EST 1
   07:00:00 UTC = 02:00:00 EST 0

Los valores del atributo "fold" tienen el valor "0" para todas las
instancias excepto aquellas que representan el segundo momento
(cronológicamente) en el tiempo en un caso ambiguo.

Ver también:

  **PEP 495** - Desambiguación de hora local
     PEP escrito por Alexander Belopolsky y Tim Peters, implementación
     por Alexander Belopolsky.


PEP 529: cambie la codificación del sistema de archivos de Windows a UTF-8
--------------------------------------------------------------------------

La representación de las rutas del sistema de archivos se realiza
mejor con str (Unicode) en lugar de bytes. Sin embargo, hay algunas
situaciones en las que el uso de bytes es suficiente y correcto.

Antes de Python 3.6, podía producirse una pérdida de datos al utilizar
rutas de bytes en Windows. Con este cambio, ahora se admite el uso de
bytes para representar rutas en Windows, siempre que esos bytes estén
codificados con la codificación devuelta por
"sys.getfilesystemencoding()", que ahora tiene como valor
predeterminado "'utf-8'".

Las aplicaciones que no usan str para representar rutas deben usar
"os.fsencode()" y "os.fsdecode()" para asegurarse de que sus bytes
estén codificados correctamente. Para volver al comportamiento
anterior, configure "PYTHONLEGACYWINDOWSFSENCODING" o llame a
"sys._enablelegacywindowsfsencoding()".

Consulte **PEP 529** para obtener más información y una discusión
sobre las modificaciones de código que pueden ser necesarias.


PEP 528: cambie la codificación de la consola de Windows a UTF-8
----------------------------------------------------------------

La consola predeterminada en Windows ahora aceptará todos los
caracteres Unicode y proporcionará objetos str leídos correctamente al
código Python. "sys.stdin", "sys.stdout" y "sys.stderr" ahora tienen
la codificación utf-8 por defecto.

Este cambio solo se aplica cuando se usa una consola interactiva y no
cuando se redirigen archivos o canalizaciones. Para volver al
comportamiento anterior para el uso de la consola interactiva,
configure "PYTHONLEGACYWINDOWSSTDIO".

Ver también:

  **PEP 528**: cambie la codificación de la consola de Windows a UTF-8
     PEP escrito e implementado por Steve Dower.


PEP 520: Conservación del orden de definición de atributos de clase
-------------------------------------------------------------------

Los atributos en el cuerpo de una definición de clase tienen un orden
natural: el mismo orden en el que aparecen los nombres en la fuente.
Este orden ahora se conserva en el atributo "__dict__" de la nueva
clase.

Además, el espacio de nombres de clase *execution* predeterminado
efectivo (devuelto desde type.__prepare__()) ahora es una asignación
que conserva el orden de inserción.

Ver también:

  **PEP 520** - Conservación del orden de definición de atributos de
  clase
     PEP escrito e implementado por Eric Snow.


PEP 468: Conservación del orden de los argumentos de las palabras clave
-----------------------------------------------------------------------

Ahora se garantiza que "**kwargs" en una firma de función es un mapeo
que conserva el orden de inserción.

Ver también:

  **PEP 468** - Conservación del orden de los argumentos de las
  palabras clave
     PEP escrito e implementado por Eric Snow.


Nueva implementación de dict
----------------------------

El tipo dict ahora usa una representación "compacta" basada en a
proposal by Raymond Hettinger que era first implemented by PyPy. El
uso de memoria del nuevo "dict()" es entre un 20% y un 25% menor en
comparación con Python 3.5.

El aspecto de conservación del orden de esta nueva implementación se
considera un detalle de implementación y no se debe confiar en él
(esto puede cambiar en el futuro, pero se desea tener esta nueva
implementación de dict en el idioma para algunas versiones antes de
cambiar la especificación del idioma para exigir la semántica de
preservación del orden para todas las implementaciones de Python
actuales y futuras; esto también ayuda a preservar la compatibilidad
con versiones anteriores del lenguaje donde el orden de iteración
aleatorio todavía está vigente, por ejemplo, Python 3.5).

(Contribuido por INADA Naoki en: número: *27350*. Idea originally
suggested by Raymond Hettinger.)


PEP 523: Agregar una API de evaluación de marcos a CPython
----------------------------------------------------------

Si bien Python proporciona un amplio soporte para personalizar cómo se
ejecuta el código, un lugar en el que no lo ha hecho es en la
evaluación de objetos de marco. Si quisiera alguna forma de
interceptar la evaluación de marcos en Python, realmente no había
ninguna forma sin manipular directamente los punteros de función para
las funciones definidas.

**PEP 523** cambia esto al proporcionar una API para hacer que la
evaluación de tramas se pueda conectar en el nivel C. Esto permitirá
que herramientas como depuradores y JIT intercepten la evaluación del
marco antes de que comience la ejecución del código Python. Esto
permite el uso de implementaciones de evaluación alternativas para el
código Python, seguimiento de la evaluación del marco, etc.

Esta API no forma parte de la API C limitada y está marcada como
privada para indicar que se espera que el uso de esta API sea limitado
y solo se aplique a casos de uso muy selectos y de bajo nivel. La
semántica de la API cambiará con Python según sea necesario.

Ver también:

  **PEP 523**: agregar una API de evaluación de marcos a CPython
     PEP escrito por Brett Cannon y Dino Viehland.


Variable de entorno PYTHONMALLOC
--------------------------------

La nueva variable de entorno "PYTHONMALLOC" permite configurar los
asignadores de memoria e instalar Python ganchos de depuración.

Ahora es posible instalar enlaces de depuración en asignadores de
memoria de Python en Python compilado en modo de lanzamiento usando
"PYTHONMALLOC=debug". Efectos de los ganchos de depuración:

* La memoria recién asignada se llena con el byte "0xCB"

* La memoria liberada se llena con el byte "0xDB"

* Detecta violaciones de la API de asignación de memoria de Python.
  Por ejemplo, "PyObject_Free()" llamó a un bloque de memoria asignado
  por "PyMem_Malloc()".

* Detectar escrituras antes del inicio de un búfer (subdesbordamientos
  del búfer)

* Detectar escrituras después del final de un búfer (desbordes de
  búfer)

* Verifique que el *GIL* se mantenga cuando se invoquen las funciones
  de asignación de los dominios "PYMEM_DOMAIN_OBJ" (ej .:
  "PyObject_Malloc()") y "PYMEM_DOMAIN_MEM" (ej .: "PyMem_Malloc()").

Verificar si el GIL se mantiene también es una nueva característica de
Python 3.6.

Consulte la función "PyMem_SetupDebugHooks()" para ver los enlaces de
depuración en los asignadores de memoria de Python.

Ahora también es posible forzar el uso del asignador "malloc()" de la
biblioteca C para todas las asignaciones de memoria de Python usando
"PYTHONMALLOC=malloc". Esto es útil cuando se utilizan depuradores de
memoria externa como Valgrind en un Python compilado en modo de
lanzamiento.

En caso de error, los ganchos de depuración en los asignadores de
memoria de Python ahora usan el módulo "tracemalloc" para obtener el
rastreo donde se asignó un bloque de memoria.

Ejemplo de error fatal en el desbordamiento del búfer usando
"python3.6 -X tracemalloc=5" (almacenar 5 cuadros en trazas):

   Debug memory block at address p=0x7fbcd41666f8: API 'o'
       4 bytes originally requested
       The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
       The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
           at tail+0: 0x02 *** OUCH
           at tail+1: 0xfb
           at tail+2: 0xfb
           at tail+3: 0xfb
           at tail+4: 0xfb
           at tail+5: 0xfb
           at tail+6: 0xfb
           at tail+7: 0xfb
       The block was made by call #1233329 to debug malloc/realloc.
       Data at p: 1a 2b 30 00

   Memory block allocated at (most recent call first):
     File "test/test_bytes.py", line 323
     File "unittest/case.py", line 600
     File "unittest/case.py", line 648
     File "unittest/suite.py", line 122
     File "unittest/suite.py", line 84

   Fatal Python error: bad trailing pad byte

   Current thread 0x00007fbcdbd32700 (most recent call first):
     File "test/test_bytes.py", line 323 in test_hex
     File "unittest/case.py", line 600 in run
     File "unittest/case.py", line 648 in __call__
     File "unittest/suite.py", line 122 in run
     File "unittest/suite.py", line 84 in __call__
     File "unittest/suite.py", line 122 in run
     File "unittest/suite.py", line 84 in __call__
     ...

(Contribución de Victor Stinner en: número: *26516* y: número:`
26564`.)


Soporte de sondeo DTrace y SystemTap
------------------------------------

Python ahora se puede construir "--with-dtrace" que habilita
marcadores estáticos para los siguientes eventos en el intérprete:

* función llamada / retorno

* recogida de basura iniciada / finalizada

* línea de código ejecutada.

Esto se puede utilizar para instrumentar intérpretes en ejecución en
producción, sin la necesidad de volver a compilar debug builds
específico o proporcionar código de depuración / perfilado específico
de la aplicación.

Más detalles en Instrumentación de CPython con DTrace y SystemTap.

La implementación actual se prueba en Linux y macOS. Es posible que se
agreguen marcadores adicionales en el futuro.

(Contribuido por Łukasz Langa en: número: *21590*, basado en parches
de Jesús Cea Avión, David Malcolm y Nikhil Benesch.)


Otros cambios de idioma
=======================

Algunos cambios más pequeños realizados en el lenguaje central de
Python son:

* Una declaración "global" o "nonlocal" ahora debe aparecer
  textualmente antes del primer uso del nombre afectado en el mismo
  ámbito. Anteriormente, este era un "SyntaxWarning".

* Ahora es posible establecer un special method en `` None`` para
  indicar que la operación correspondiente no está disponible. Por
  ejemplo, si una clase establece "__iter__()" en "None", la clase no
  es iterable. (Contribuido por Andrew Barnert e Ivan Levkivskyi en:
  número: *25958*.)

* Las secuencias largas de líneas de rastreo repetidas ahora se
  abrevian como ""[Previous line repeated {count} more times]""
  (consulte rastrear para ver un ejemplo). (Contribución de Emanuel
  Barry en: número: *26823*.)

* Importar ahora lanza la nueva excepción "ModuleNotFoundError"
  (subclase de "ImportError") cuando no puede encontrar un módulo. El
  código que actualmente busca ImportError (en try-except) seguirá
  funcionando. (Contribución de Eric Snow en: número: *15767*.)

* Los métodos de clase que se basan en "super()" de argumento cero
  ahora funcionarán correctamente cuando se llamen desde métodos de
  metaclase durante la creación de la clase. (Contribución de Martin
  Teichmann en: número: *23722*.)


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


misterios
---------

El objetivo principal del nuevo módulo "secrets" es proporcionar una
forma obvia de generar de manera confiable valores pseudoaleatorios
criptográficamente fuertes adecuados para administrar secretos, como
autenticación de cuentas, tokens y similares.

Advertencia:

  Tenga en cuenta que los generadores pseudoaleatorios en el módulo
  "random" deben utilizarse *NOT* por motivos de seguridad. Utilice
  "secrets" en Python 3.6+ y "os.urandom()" en Python 3.5 y versiones
  anteriores.

Ver también:

  **PEP 506**: adición de un módulo de secretos a la biblioteca
  estándar
     PEP escrito e implementado por Steven D'Aprano.


Módulos mejorados
=================


formación
---------

Los iteradores agotados de "array.array" ahora permanecerán agotados
incluso si se extiende la matriz iterada. Esto es consistente con el
comportamiento de otras secuencias mutables.

Contribuido por Serhiy Storchaka en bpo-26492.


ast
---

Se ha agregado el nuevo nodo "ast.Constant" AST. Puede ser utilizado
por optimizadores AST externos con el propósito de plegado constante.

Contribuido por Victor Stinner en bpo-26146.


asyncio
-------

A partir de Python 3.6, el módulo "asyncio" ya no es provisional y su
API se considera estable.

Cambios notables en el módulo "asyncio" desde Python 3.5.0 (todos
retroportados a 3.5.x debido al estado provisional):

* La función "get_event_loop()" se ha cambiado para devolver siempre
  el bucle que se está ejecutando actualmente cuando se llama desde
  corrutinas y devoluciones de llamada. (Contribuido por Yury
  Selivanov en bpo-28613.)

* La función "ensure_future()" y todas las funciones que la utilizan,
  como "loop.run_until_complete()", ahora aceptan todo tipo de
  *awaitable objects*. (Contribuido por Yury Selivanov.)

* Nueva función "run_coroutine_threadsafe()" para enviar corrutinas a
  bucles de eventos de otros hilos. (Contribución de Vincent Michel.)

* Nuevo método "Transport.is_closing()" para comprobar si el
  transporte está cerrando o está cerrado. (Contribuido por Yury
  Selivanov.)

* El método "loop.create_server()" ahora puede aceptar una lista de
  hosts. (Contribuido por Yann Sionneau.)

* Nuevo método "loop.create_future()" para crear objetos Future. Esto
  permite implementaciones alternativas de bucle de eventos, como
  uvloop, para proporcionar una implementación "asyncio.Future" más
  rápida. (Contribuido por Yury Selivanov en bpo-27041.)

* Nuevo método "loop.get_exception_handler()" para obtener el
  controlador de excepciones actual. (Contribuido por Yury Selivanov
  en bpo-27040.)

* Nuevo método "StreamReader.readuntil()" para leer datos de la
  secuencia hasta que aparezca una secuencia de bytes de separación.
  (Contribuido por Mark Korenberg.)

* Se ha mejorado el rendimiento de "StreamReader.readexactly()".
  (Contribuido por Mark Korenberg en bpo-28370.)

* El método "loop.getaddrinfo()" está optimizado para evitar llamar a
  la función "getaddrinfo" del sistema si la dirección ya está
  resuelta. (Contribuido por A. Jesse Jiryu Davis.)

* El método "loop.stop()" se ha cambiado para detener el bucle
  inmediatamente después de la iteración actual. Se descartarán todas
  las devoluciones de llamada nuevas programadas como resultado de la
  última iteración. (Contribuido por Guido van Rossum en bpo-25593.)

* "Future.set_exception" ahora lanzará "TypeError" cuando se pase una
  instancia de la excepción "StopIteration". (Contribuido por Chris
  Angelico en bpo-26221.)

* Nuevo método "loop.connect_accepted_socket()" para ser usado por
  servidores que aceptan conexiones fuera de asyncio, pero que usan
  asyncio para manejarlas. (Contribuido por Jim Fulton en bpo-27392.)

* El indicador "TCP_NODELAY" ahora está configurado para todos los
  transportes TCP de forma predeterminada. (Contribuido por Yury
  Selivanov en bpo-27456.)

* Nuevo "loop.shutdown_asyncgens()" para cerrar correctamente los
  generadores asincrónicos pendientes antes de cerrar el ciclo.
  (Contribuido por Yury Selivanov en bpo-28003.)

* Las clases "Future" y "Task" ahora tienen una implementación C
  optimizada que hace que el código asyncio sea hasta un 30% más
  rápido. (Contribuido por Yury Selivanov e INADA Naoki en bpo-26081 y
  bpo-28544.)


binascii
--------

La función "b2a_base64()" ahora acepta un argumento de palabra clave
*newline* opcional para controlar si el carácter de nueva línea se
agrega al valor de retorno. (Contribuido por Victor Stinner en
bpo-25357.)


cmath
-----

Se ha agregado la nueva constante "cmath.tau" (*τ*). (Contribuido por
Lisa Roach en bpo-12345, consulte **PEP 628** para obtener más
detalles).

Nuevas constantes: "cmath.inf" y "cmath.nan" para que coincidan con
"math.inf" y "math.nan", y también "cmath.infj" y "cmath.nanj" para
que coincidan con el formato utilizado por la repetición compleja.
(Contribuido por Mark Dickinson en bpo-23229.)


colecciones
-----------

Se ha agregado la nueva clase base abstracta "Collection" para
representar clases de contenedores iterables de tamaño. (Contribuido
por Ivan Levkivskyi, documentos de Neil Girdhar en bpo-27598.)

La nueva clase base abstracta "Reversible". representa clases
iterables que también proveen el método "__reversed__()".(Contribuido
por Ivan Levkivskyi en bpo-25987.)

La nueva clase base abstracta "AsyncGenerator" representa generadores
asincrónicos. (Contribuido por Yury Selivanov en bpo-28720.)

La función "namedtuple()" ahora acepta un argumento de palabra clave
opcional *module*, que, cuando se especifica, se utiliza para el
atributo "__module__" de la clase de tupla con nombre devuelto.
(Contribuido por Raymond Hettinger en bpo-17941.)

Los argumentos *verbose* and *rename* para "namedtuple()" ahora son
solo palabras clave. (Contribuido por Raymond Hettinger en bpo-25628.)

Las instancias de "collections.deque" recursivas ahora se pueden
eliminar. (Contribuido por Serhiy Storchaka en bpo-26482.)


Futuros concurrentes
--------------------

El constructor de la clase "ThreadPoolExecutor" ahora acepta un
argumento *thread_name_prefix* opcional para que sea posible
personalizar los nombres de los subprocesos creados por el grupo.
(Contribuido por Gregory P. Smith en bpo-27664.)


contextlib
----------

The "contextlib.AbstractContextManager" class has been added to
provide an abstract base class for context managers.  It provides a
sensible default implementation for "__enter__()" which returns "self"
and leaves "__exit__()" an abstract method.  A matching class has been
added to the "typing" module as "typing.ContextManager". (Contributed
by Brett Cannon in bpo-25609.)


fecha y hora
------------

Las clases "datetime" y "time" tienen el nuevo atributo "fold"
utilizado para eliminar la ambigüedad de la hora local cuando sea
necesario. Muchas funciones en el "datetime" se han actualizado para
admitir la desambiguación de la hora local. Consulte la sección Local
Time Disambiguation para obtener más información. (Contribuido por
Alexander Belopolsky en bpo-24773.)

Los métodos "datetime.strftime()" y "date.strftime()" ahora admiten
las directivas de fecha ISO 8601 "%G", "%u" y "%V". (Contribuido por
Ashley Anderson en bpo-12006.)

La función "datetime.isoformat()" ahora acepta un argumento *timespec*
opcional que especifica el número de componentes adicionales del valor
de tiempo a incluir. (Contribuido por Alessandro Cucci y Alexander
Belopolsky en bpo-19475.)

El "datetime.combine()" ahora acepta un argumento *tzinfo* opcional.
(Contribuido por Alexander Belopolsky en bpo-27661.)


decimal
-------

Nuevo método "Decimal.as_integer_ratio()" que devuelve un par "(n, d)"
de enteros que representan la instancia "Decimal" dada como una
fracción, en términos más bajos y con un denominador positivo:

   >>> Decimal('-3.14').as_integer_ratio()
   (-157, 50)

(Contribuido por Stefan Krah y Mark Dickinson en bpo-25928.)


distutils
---------

El atributo "default_format" se ha eliminado de
"distutils.command.sdist.sdist" y el atributo "formats" se establece
por defecto en "['gztar']". Aunque no está previsto, es posible que
sea necesario adaptar cualquier código que dependa de la presencia de
"default_format". Consulte bpo-27819 para obtener más detalles.


Email
-----

La nueva API de correo electrónico, habilitada a través de la palabra
clave *policy* para varios constructores, ya no es provisional. La
documentación de "email" se ha reorganizado y reescrito para centrarse
en la nueva API, conservando la documentación anterior para la API
heredada. (Contribuido por R. David Murray en bpo-24277.)

Las clases "email.mime" ahora aceptan todas una palabra clave *policy*
opcional. (Contribuido por Berker Peksag en bpo-27331.)

El "DecodedGenerator" ahora admite la palabra clave *policy*.

Hay un nuevo atributo "policy", "message_factory", que controla qué
clase se usa por defecto cuando el analizador crea nuevos objetos de
mensaje. Para la política "email.policy.compat32", es "Message", para
las nuevas políticas es "EmailMessage". (Contribuido por R. David
Murray en bpo-20476.)


codificaciones
--------------

En Windows, se agregó la codificación "'oem'" para usar "CP_OEMCP" y
el alias "'ansi'" para la codificación "'mbcs'" existente, que usa la
página de códigos "CP_ACP". (Contribuido por Steve Dower en
bpo-27959.)


enumeración
-----------

Se han agregado dos nuevas clases base de enumeración al módulo
"enum": "Flag" y "IntFlags". Ambos se utilizan para definir constantes
que se pueden combinar utilizando los operadores bit a bit.
(Contribuido por Ethan Furman en bpo-23591.)

Muchos módulos de biblioteca estándar se han actualizado para usar la
clase "IntFlags" para sus constantes.

El nuevo valor de "enum.auto" se puede utilizar para asignar valores a
los miembros de enumeración automáticamente:

   >>> from enum import Enum, auto
   >>> class Color(Enum):
   ...     red = auto()
   ...     blue = auto()
   ...     green = auto()
   ...
   >>> list(Color)
   [<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]


manipulador de faltas
---------------------

En Windows, el módulo "faulthandler" ahora instala un controlador para
las excepciones de Windows: consulte "faulthandler.enable()".
(Contribuido por Victor Stinner en bpo-23848.)


entrada de archivo
------------------

"hook_encoded()" ahora admite el argumento *errors*. (Contribuido por
Joseph Hackman en bpo-25788.)


hashlib
-------

"hashlib" es compatible con OpenSSL 1.1.0. La versión mínima
recomendada es 1.0.2. (Contribuido por Christian Heimes en bpo-26470.)

Se agregaron funciones hash BLAKE2 al módulo. "blake2b()" y
"blake2s()" siempre están disponibles y admiten el conjunto completo
de funciones de BLAKE2. (Contribuido por Christian Heimes en bpo-26798
basado en código de Dmitry Chestnykh y Samuel Neves. Documentación
escrita por Dmitry Chestnykh.)

Se agregaron las funciones hash SHA-3 "sha3_224()", "sha3_256()",
"sha3_384()", "sha3_512()" y las funciones hash SHAKE "shake_128()" y
"shake_256()". (Contribuido por Christian Heimes en bpo-16113. Paquete
de código Keccak por Guido Bertoni, Joan Daemen, Michaël Peeters,
Gilles Van Assche y Ronny Van Keer.)

La función de derivación de claves basada en contraseña "scrypt()"
ahora está disponible con OpenSSL 1.1.0 y versiones posteriores.
(Contribuido por Christian Heimes en bpo-27928.)


http.client
-----------

"HTTPConnection.request()" y "endheaders()" ahora admiten cuerpos de
solicitud de codificación fragmentados. (Contribuido por Demian Brecht
y Rolf Krahl en bpo-12319.)


idlelib y IDLE
--------------

El paquete idlelib se está modernizando y refactorizando para que IDLE
se vea y funcione mejor y para que el código sea más fácil de
entender, probar y mejorar. Parte de hacer que IDLE se vea mejor,
especialmente en Linux y Mac, es usar widgets ttk, principalmente en
los cuadros de diálogo. Como resultado, IDLE ya no se ejecuta con tcl
/ tk 8.4. Ahora requiere tcl / tk 8.5 o 8.6. Recomendamos ejecutar la
última versión de cualquiera.

La 'modernización' incluye el cambio de nombre y la consolidación de
módulos idlelib. El cambio de nombre de archivos con nombres en
mayúsculas parciales es similar al cambio de nombre de, por ejemplo,
Tkinter y TkFont a tkinter y tkinter.font en 3.0. Como resultado, las
importaciones de archivos idlelib que funcionaban en 3.5 normalmente
no funcionarán en 3.6. Se necesitará al menos un cambio de nombre de
módulo (ver idlelib / README.txt), a veces más. (Los cambios de nombre
aportados por Al Swiegart y Terry Reedy en bpo-24225. La mayoría de
los parches idlelib desde entonces han sido y serán parte del
proceso).

En compensación, el resultado final será que algunas clases de idlelib
serán más fáciles de usar, con mejores API y cadenas de documentación
que las expliquen. Se agregará información útil adicional a idlelib
cuando esté disponible.

Nuevo en 3.6.2:

Varias correcciones para autocompletar. (Contribuido por Louie Lu en
bpo-15786.)

Nuevo en 3.6.3:

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

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

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 varios
números).

Nuevo en 3.6.4:

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

Nuevo en 3.6.6:

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 salta 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.6.7:

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


importlib
---------

Importar ahora lanza la nueva excepción "ModuleNotFoundError"
(subclase de "ImportError") cuando no puede encontrar un módulo.
Codifique que las comprobaciones actuales para "ImportError" (en try-
except) seguirán funcionando. (Contribuido por Eric Snow en
bpo-15767.)

"importlib.util.LazyLoader" ahora llama a "create_module()" en el
cargador envuelto, eliminando la restricción de que
"importlib.machinery.BuiltinImporter" y
"importlib.machinery.ExtensionFileLoader" no se pueden usar con
"importlib.util.LazyLoader".

"importlib.util.cache_from_source()",
"importlib.util.source_from_cache()" y
"importlib.util.spec_from_file_location()" ahora aceptan un *path-like
object*.


inspeccionar
------------

La función "inspect.signature()" ahora reporta los parámetros ".0"
implícitos generados por el compilador para los alcances de
comprensión y expresión del generador como si fueran parámetros solo
posicionales llamados "implicit0". (Contribuido por Jelle Zijlstra en
bpo-19611.)

Para reducir la pérdida de código al actualizar desde Python 2.7 y la
API "inspect.getargspec()" heredada, se ha revertido la desaprobación
previamente documentada de "inspect.getfullargspec()". Si bien esta
función es conveniente para bases de código Python 2/3 de fuente única
/ fuente, la interfaz "inspect.signature()" más rica sigue siendo el
enfoque recomendado para el nuevo código. (Contribuido por Nick
Coghlan en bpo-27172)


json
----

"json.load()" y "json.loads()" ahora admiten entrada binaria. El JSON
codificado debe representarse mediante UTF-8, UTF-16 o UTF-32.
(Contribuido por Serhiy Storchaka en bpo-17909.)


Inicio sesión
-------------

Se agregó el nuevo método "WatchedFileHandler.reopenIfNeeded()" para
agregar la capacidad de verificar si es necesario volver a abrir el
archivo de registro. (Contribuido por Marian Horban en bpo-24884.)


Matemáticas
-----------

La constante tau (*τ*) se ha agregado a los módulos "math" y "cmath".
(Contribuido por Lisa Roach en bpo-12345, consulte **PEP 628** para
obtener más detalles).


multiprocesamiento
------------------

Proxy Objects devuelto por "multiprocessing.Manager()" ahora se puede
anidar. (Contribuido por Davin Potts en bpo-6766.)


os
--

Consulte el resumen de PEP 519 para obtener detalles sobre cómo los
módulos "os" y "os.path" ahora admiten *path-like objects*.

"scandir()" ahora admite rutas "bytes" en Windows.

Un nuevo método "close()" permite cerrar explícitamente un iterador
"scandir()". El iterador "scandir()" ahora admite el protocolo
*context manager*. Si un iterador "scandir()" no se agota ni se cierra
explícitamente, se emitirá un "ResourceWarning" en su destructor.
(Contribuido por Serhiy Storchaka en bpo-25994.)

En Linux, "os.urandom()" ahora se bloquea hasta que se inicializa el
grupo de entropía aleatoria del sistema para aumentar la seguridad.
Consulte el **PEP 524** para conocer la justificación.

El syscall de Linux "getrandom()" (obtener bytes aleatorios) ahora se
expone como la nueva función "os.getrandom()". (Contribuido por Victor
Stinner, parte del **PEP 524**)


Pathlib
-------

"pathlib" ahora es compatible con *path-like objects*. (Contribuido
por Brett Cannon en bpo-27186.)

Consulte el resumen de PEP 519 para obtener más detalles.


pdb
---

El constructor de la clase "Pdb" tiene un nuevo argumento *readrc*
opcional para controlar si se deben leer los archivos ".pdbrc".


pepinillo
---------

Los objetos que necesitan que se llame a "__new__" con argumentos de
palabras clave ahora se pueden seleccionar utilizando pickle protocols
anterior a la versión del protocolo 4. La versión 4 del protocolo ya
es compatible con este caso. (Contribuido por Serhiy Storchaka en
bpo-24164.)


pepinillos
----------

"pickletools.dis()" ahora genera el índice de memo implícito para el
código de operación "MEMOIZE". (Contribuido por Serhiy Storchaka en
bpo-25382.)


Pydoc
-----

El módulo "pydoc" ha aprendido a respetar la variable de entorno
"MANPAGER". (Contribuido por Matthias Klose en bpo-8637.)

"help()" y "pydoc" ahora pueden enumerar campos de tupla con nombre en
el orden en que se definieron en lugar de alfabéticamente.
(Contribuido por Raymond Hettinger en bpo-24879.)


aleatorio
---------

La nueva función "choices()" devuelve una lista de elementos de tamaño
especificado de la población dada con pesos opcionales. (Contribuido
por Raymond Hettinger en bpo-18844.)


re
--

Se agregó soporte para lapsos de modificadores en expresiones
regulares. Ejemplos: "'(?i:p)ython'" coincide con "'python'" y
"'Python'", pero no con "'PYTHON'"; "'(?i)g(?-i:v)r'" coincide con
"'GvR'" y "'gvr'", pero no con "'GVR'". (Contribuido por Serhiy
Storchaka en bpo-433028.)

Se puede acceder a los grupos de objetos coincidentes mediante
"__getitem__", que es equivalente a "group()". Entonces "mo['name']"
ahora es equivalente a "mo.group('name')". (Contribuido por Eric Smith
en bpo-24454.)

Los objetos "Match" ahora admiten "index-like objects" como índices de
grupo. (Contribuido por Jeroen Demeyer y Xiang Zhang en bpo-27177.)


readline
--------

Se agregó "set_auto_history()" para habilitar o deshabilitar la
adición automática de entradas a la lista del historial. (Contribuido
por Tyler Crompton en bpo-26870.)


rlcompleter
-----------

Los nombres de atributos privados y especiales ahora se omiten a menos
que el prefijo comience con guiones bajos. Se agrega un espacio o dos
puntos después de algunas palabras clave completadas. (Contribuido por
Serhiy Storchaka en bpo-25011 y bpo-25209.)


shlex
-----

El "shlex" tiene mucho improved shell compatibility a través del nuevo
argumento *punctuation_chars* para controlar qué caracteres se tratan
como puntuación. (Contribuido por Vinay Sajip en bpo-1521950.)


sitio
-----

When specifying paths to add to "sys.path" in a ".pth" file, you may
now specify file paths on top of directories (e.g. zip files).
(Contributed by Wolfgang Langner in bpo-26587).


sqlite3
-------

"sqlite3.Cursor.lastrowid" ahora admite la declaración "REPLACE".
(Contribuido por Alex LordThorsen en bpo-16864.)


enchufe
-------

La función "ioctl()" ahora admite el código de control
"SIO_LOOPBACK_FAST_PATH". (Contribuido por Daniel Stokes en
bpo-26536.)

Las constantes "getsockopt()" "SO_DOMAIN", "SO_PROTOCOL", "SO_PEERSEC"
y "SO_PASSSEC" ahora son compatibles. (Contribuido por Christian
Heimes en bpo-26907.)

El "setsockopt()" ahora admite el formulario "setsockopt(level,
optname, None, optlen: int)". (Contribuido por Christian Heimes en
bpo-27744.)

El módulo de socket ahora admite la familia de direcciones "AF_ALG"
para interactuar con la API de cifrado del kernel de Linux. Se
agregaron "ALG_*", "SOL_ALG" y "sendmsg_afalg()". (Contribuido por
Christian Heimes en bpo-27744 con el apoyo de Victor Stinner.)

New Linux constants "TCP_USER_TIMEOUT" and "TCP_CONGESTION" were
added. (Contributed by Omar Sandoval, bpo-26273).


servidor de sockets
-------------------

Los servidores basados en el módulo "socketserver", incluidos los
definidos en "http.server", "xmlrpc.server" y "wsgiref.simple_server",
ahora admiten el protocolo *context manager*. (Contribuido por Aviv
Palivoda en bpo-26404.)

El atributo "wfile" de las clases "StreamRequestHandler" ahora
implementa la interfaz de escritura "io.BufferedIOBase". En
particular, ahora se garantiza que llamar a "write()" enviará los
datos completos. (Contribuido por Martin Panter en bpo-26721.)


ssl
---

"ssl" es compatible con OpenSSL 1.1.0. La versión mínima recomendada
es 1.0.2. (Contribuido por Christian Heimes en bpo-26470.)

Se ha eliminado 3DES de los conjuntos de cifrado predeterminados y se
han agregado conjuntos de cifrado ChaCha20 Poly1305. (Contribuido por
Christian Heimes en bpo-27850 y bpo-27766.)

"SSLContext" tiene una mejor configuración predeterminada para
opciones y cifrados. (Contribuido por Christian Heimes en bpo-28043.)

La sesión SSL se puede copiar de una conexión del lado del cliente a
otra con la nueva clase "SSLSession". La reanudación de la sesión de
TLS puede acelerar el apretón de manos inicial, reducir la latencia y
mejorar el rendimiento (Contribuido por Christian Heimes en bpo-19500
basado en un borrador de Alex Warhawk).

El nuevo método "get_ciphers()" se puede utilizar para obtener una
lista de cifrados habilitados en orden de prioridad de cifrado.

Todas las constantes y banderas se han convertido a "IntEnum" y
"IntFlags". (Contribuido por Christian Heimes en bpo-28025.)

Se agregaron protocolos TLS específicos del lado del servidor y del
cliente para "SSLContext". (Contribuido por Christian Heimes en
bpo-28085.)


Estadísticas
------------

Se ha agregado una nueva función "harmonic_mean()". (Contribuido por
Steven D'Aprano en bpo-27181.)


estructura
----------

"struct" ahora admite flotadores de media precisión IEEE 754 a través
del especificador de formato "'e'". (Contribuido por Eli Stevens, Mark
Dickinson en bpo-11734.)


subproceso
----------

El destructor "subprocess.Popen" ahora emite una advertencia
"ResourceWarning" si el proceso hijo todavía se está ejecutando.
Utilice el protocolo del administrador de contexto ("with proc: ...")
o llame explícitamente al método "wait()" para leer el estado de
salida del proceso hijo. (Contribuido por Victor Stinner en
bpo-26741.)

El constructor "subprocess.Popen" y todas las funciones que le pasan
argumentos ahora aceptan argumentos *encoding* y *errors*.
Especificando alguno de ellos activará el modo texto para *stdin*,
*stdout* y *stderr*. (Contribuido por Steve Dower en bpo-6135.)


sys
---

La nueva función "getfilesystemencodeerrors()" devuelve el nombre del
modo de error utilizado para convertir entre nombres de archivo
Unicode y nombres de archivo en bytes. (Contribuido por Steve Dower en
bpo-27781.)

En Windows, el valor de retorno de la función "getwindowsversion()"
ahora incluye el campo *platform_version* que contiene la versión
principal precisa, la versión secundaria y el número de compilación
del sistema operativo actual, en lugar de la versión que se está
emulando para el proceso (contribución de Steve Dower en bpo-27932 .)


telnetlib
---------

"Telnet" es ahora un administrador de contexto (contribución de
Stéphane Wirtel en bpo-25485).


tiempo
------

Los atributos "struct_time" "tm_gmtoff" y "tm_zone" ahora están
disponibles en todas las plataformas.


cronométralo
------------

Se ha agregado el nuevo método de conveniencia "Timer.autorange()"
para llamar a "Timer.timeit()" repetidamente para que el tiempo de
ejecución total sea mayor o igual a 200 milisegundos. (Contribuido por
Steven D'Aprano en bpo-6422.)

"timeit" ahora advierte cuando hay una variación sustancial (4x) entre
el mejor y el peor momento. (Contribuido por Serhiy Storchaka en
bpo-23552.)


tkinter
-------

Se agregaron los métodos "trace_add()", "trace_remove()" y
"trace_info()" en la clase "tkinter.Variable". Reemplazan los métodos
antiguos "trace_variable()", "trace()", "trace_vdelete()" y
"trace_vinfo()" que usan comandos Tcl obsoletos y es posible que no
funcionen en versiones futuras de Tcl. (Contribuido por Serhiy
Storchaka en bpo-22115).


rastrear
--------

Tanto el módulo de rastreo como la pantalla de excepción incorporada
del intérprete ahora abrevian largas secuencias de líneas repetidas en
los rastreos como se muestra en el siguiente ejemplo:

   >>> def f(): f()
   ...
   >>> f()
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "<stdin>", line 1, in f
     File "<stdin>", line 1, in f
     File "<stdin>", line 1, in f
     [Previous line repeated 995 more times]
   RecursionError: maximum recursion depth exceeded

(Contribuido por Emanuel Barry en bpo-26823.)


tracemalloc
-----------

El módulo "tracemalloc" ahora admite el seguimiento de asignaciones de
memoria en varios espacios de direcciones diferentes.

Se ha agregado la nueva clase de filtro "DomainFilter" para filtrar
los rastros de bloques por su espacio de direcciones (dominio).

(Contribuido por Victor Stinner en bpo-26588.)


mecanografía
------------

Dado que el módulo "typing" es *provisional*, todos los cambios
introducidos en Python 3.6 también se han actualizado a Python 3.5.x.

El módulo "typing" tiene un soporte mucho mejor para los alias de tipo
genérico. Por ejemplo, "Dict[str, Tuple[S, T]]" ahora es una anotación
de tipo válida. (Contribuido por Guido van Rossum en Github #195.)

Se ha agregado la clase "typing.ContextManager" para representar
"contextlib.AbstractContextManager". (Contribuido por Brett Cannon en
bpo-25609.)

Se ha agregado la clase "typing.Collection" para representar
"collections.abc.Collection". (Contribuido por Ivan Levkivskyi en
bpo-27598.)

Se ha agregado la construcción de tipo "typing.ClassVar" para marcar
las variables de clase. Como se introdujo en **PEP 526**, una
anotación de variable envuelta en ClassVar indica que un atributo dado
está destinado a ser utilizado como una variable de clase y no debe
establecerse en instancias de esa clase. (Contribuido por Ivan
Levkivskyi en Github #280.)

Una nueva constante "TYPE_CHECKING" que se supone que es "True" por
los verificadores de tipo estático, pero es "False" en tiempo de
ejecución. (Contribuido por Guido van Rossum en Github #230.)

Se ha agregado una nueva función auxiliar "NewType()" para crear tipos
distintos ligeros para anotaciones:

   from typing import NewType

   UserId = NewType('UserId', int)
   some_id = UserId(524313)

El verificador de tipo estático tratará el nuevo tipo como si fuera
una subclase del tipo original. (Contribuido por Ivan Levkivskyi en
Github #189.)


unicodedata
-----------

The "unicodedata" module now uses data from Unicode 9.0.0.
(Contributed by Benjamin Peterson.)


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

La clase "Mock" tiene las siguientes mejoras:

* Dos nuevos métodos, "Mock.assert_called()" y
  "Mock.assert_called_once()" para verificar si se llamó al objeto
  simulado. (Contribuido por Amit Saha en bpo-26323.)

* El método "Mock.reset_mock()" ahora tiene dos argumentos opcionales
  de solo palabras clave: *return_value* and *side_effect*.
  (Contribuido por Kushal Das en bpo-21271.)


urllib.request
--------------

Si una solicitud HTTP tiene un archivo o un cuerpo iterable (que no
sea un objeto de bytes) pero no un encabezado "Content-Length", en
lugar de generar un error, "AbstractHTTPHandler" ahora recurre a la
codificación de transferencia fragmentada. (Contribuido por Demian
Brecht y Rolf Krahl en bpo-12319.)


urllib.robotparser
------------------

"RobotFileParser" ahora admite las extensiones "Crawl-delay" y
"Request-rate". (Contribuido por Nikolay Bogoychev en bpo-16099.)


venv
----

"venv" acepta un nuevo parámetro "--prompt". Este parámetro
proporciona un prefijo alternativo para el entorno virtual. (Propuesto
por Łukasz Balcerzak y portado a 3.6 por Stéphane Wirtel en
bpo-22829.)


advertencias
------------

También se ha agregado un nuevo atributo opcional *source* a la
función "warnings.warn_explicit()" : el objeto destruído que lanzó un
"ResourceWarning". Un atributo *source* también se agregó a
"warnings.WarningMessage" (aportado por Victor Stinner en bpo-26568 y
bpo-26567).

Cuando se registra una advertencia "ResourceWarning", el módulo
"tracemalloc" ahora se usa para intentar recuperar el rastreo donde se
asignó el objeto destruido.

Ejemplo con el script "example.py":

   import warnings

   def func():
       return open(__file__)

   f = func()
   f = None

Salida del comando "python3.6 -Wd -X tracemalloc=5 example.py":

   example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
     f = None
   Object allocated at (most recent call first):
     File "example.py", lineno 4
       return open(__file__)
     File "example.py", lineno 6
       f = func()

El rastreo "Objeto asignado en" es nuevo y solo se muestra si
"tracemalloc" está rastreando asignaciones de memoria de Python y si
el módulo "warnings" ya fue importado.


winreg
------

Se agregó el tipo entero de 64 bits "REG_QWORD". (Contribuido por
Clement Rouault en bpo-23026.)


winsonido
---------

Se permite que los argumentos de palabras clave se pasen a "Beep",
"MessageBeep" y "PlaySound" (bpo-27982).


xmlrpc.client
-------------

El módulo "xmlrpc.client" ahora admite la descomposición de tipos de
datos adicionales utilizados por la implementación Apache XML-RPC para
números y "None". (Contribuido por Serhiy Storchaka en bpo-26885.)


archivo zip
-----------

Un nuevo método de clase "ZipInfo.from_file()" permite crear una
instancia "ZipInfo" a partir de un archivo del sistema de archivos. Se
puede usar un nuevo método "ZipInfo.is_dir()" para verificar si la
instancia "ZipInfo" representa un directorio. (Contribuido por Thomas
Kluyver en bpo-26039.)

El método "ZipFile.open()" ahora se puede utilizar para escribir datos
en un archivo ZIP, así como para extraer datos. (Contribuido por
Thomas Kluyver en bpo-26039.)


zlib
----

Las funciones "compress()" y "decompress()" ahora aceptan argumentos
de palabras clave. (Contribuido por Aviv Palivoda en bpo-26243 y Xiang
Zhang en bpo-16764 respectivamente).


Optimizaciones
==============

* El intérprete de Python ahora usa un código de palabra de 16 bits en
  lugar de un código de bytes, lo que hizo posible una serie de
  optimizaciones de código de operación. (Contribuido por Demur Rumed
  con aportes y reseñas de Serhiy Storchaka y Victor Stinner en
  bpo-26647 y bpo-28050.)

* La clase "asyncio.Future" ahora tiene una implementación C
  optimizada. (Contribuido por Yury Selivanov e INADA Naoki en
  bpo-26081.)

* La clase "asyncio.Task" ahora tiene una implementación C optimizada.
  (Contribuido por Yury Selivanov en bpo-28544.)

* Varias mejoras de implementación en el módulo "typing" (como el
  almacenamiento en caché de tipos genéricos) permiten mejoras de
  rendimiento hasta 30 veces mayores y una huella de memoria reducida.

* El decodificador ASCII ahora es hasta 60 veces más rápido para los
  controladores de errores "surrogateescape", "ignore" y "replace"
  (Contribuido por Victor Stinner en bpo-24870).

* Los codificadores ASCII y Latin1 ahora son hasta 3 veces más rápidos
  para el controlador de errores "surrogateescape" (Contribuido por
  Victor Stinner en bpo-25227).

* El codificador UTF-8 ahora es hasta 75 veces más rápido para los
  controladores de errores "ignore", "replace", "surrogateescape",
  "surrogatepass" (Contribuido por Victor Stinner en bpo-25267).

* El decodificador UTF-8 ahora es hasta 15 veces más rápido para los
  controladores de errores "ignore", "replace" y "surrogateescape"
  (Contribuido por Victor Stinner en bpo-25301).

* "bytes % args" ahora es hasta 2 veces más rápido. (Contribuido por
  Victor Stinner en bpo-25349).

* "bytearray % args" es ahora entre 2,5 y 5 veces más rápido.
  (Contribuido por Victor Stinner en bpo-25399).

* Optimice "bytes.fromhex()" y "bytearray.fromhex()": ahora son entre
  2 y 3,5 veces más rápidos. (Contribuido por Victor Stinner en
  bpo-25401).

* Optimice "bytes.replace(b'', b'.')" y "bytearray.replace(b'',
  b'.')": hasta un 80% más rápido. (Contribuido por Josh Snider en
  bpo-26574).

* Las funciones de asignación del dominio "PyMem_Malloc()" (
  "PYMEM_DOMAIN_MEM") ahora usan la función pymalloc memory allocator
  en lugar de la función "malloc()" de la biblioteca C. El asignador
  de pymalloc está optimizado para objetos menores o iguales a 512
  bytes con una vida útil corta y usa "malloc()" para bloques de
  memoria más grandes. (Contribuido por Victor Stinner en bpo-26249).

* "pickle.load()" y "pickle.loads()" ahora son hasta un 10% más
  rápidos al deserializar muchos objetos pequeños (contribución de
  Victor Stinner en bpo-27056).

* Pasar *keyword arguments* a una función tiene una sobrecarga en
  comparación con pasar *positional arguments*. Ahora, en las
  funciones de extensión implementadas con el uso de Argument Clinic,
  esta sobrecarga se reduce significativamente. (Contribuido por
  Serhiy Storchaka en bpo-27574).

* Funciones "glob()" y "iglob()" optimizadas en el módulo "glob";
  ahora son unas 3 a 6 veces más rápidas. (Contribuido por Serhiy
  Storchaka en bpo-25596).

* Globbing optimizado en "pathlib" mediante "os.scandir()"; ahora es
  alrededor de 1,5 a 4 veces más rápido. (Contribuido por Serhiy
  Storchaka en bpo-26032).

* Se ha mejorado significativamente el rendimiento de análisis,
  iteración y copia profunda de "xml.etree.ElementTree". (Contribuido
  por Serhiy Storchaka en bpo-25638, bpo-25873 y bpo-25869.)

* La creación de instancias de "fractions.Fraction" a partir de
  flotantes y decimales es ahora de 2 a 3 veces más rápida.
  (Contribuido por Serhiy Storchaka en bpo-25971.)


Cambios en la API de Build y C
==============================

* Python ahora requiere algo de compatibilidad con C99 en la cadena de
  herramientas para compilarse. En particular, Python ahora usa macros
  y tipos de enteros estándar en lugar de macros personalizadas como
  "PY_LONG_LONG". Para obtener más información, consulte **PEP 7** y
  bpo-17884.

* La compilación cruzada de CPython con el NDK de Android y el nivel
  de API de Android establecido en 21 (Android 5.0 Lollipop) o
  superior se ejecuta correctamente. Si bien Android aún no es una
  plataforma compatible, el conjunto de pruebas de Python se ejecuta
  en el emulador de Android con solo alrededor de 16 fallas en las
  pruebas. Consulte el meta-problema de Android bpo-26865.

* Se ha agregado el indicador de configuración "--enable-
  optimizations". Activarlo activará optimizaciones costosas como PGO.
  (Parche original de Alecsandru Patrascu de Intel en bpo-26359.)

* El *GIL* ahora debe mantenerse cuando se llaman las funciones de
  asignación de los dominios "PYMEM_DOMAIN_OBJ" (por ejemplo:
  "PyObject_Malloc()") y: "PYMEM_DOMAIN_MEM" (por ejemplo:
  "PyMem_Malloc()").

* Nueva API "Py_FinalizeEx()" que indica si fallaron los datos
  almacenados en búfer. (Contribuido por Martin Panter en bpo-5319.)

* "PyArg_ParseTupleAndKeywords()" ahora es compatible con positional-
  only parameters. Los parámetros solo posicionales se definen
  mediante nombres vacíos. (Contribuido por Serhiy Storchaka en
  bpo-26282).

* El método "PyTraceback_Print" ahora abrevia secuencias largas de
  líneas repetidas como ""[Previous line repeated {count} more
  times]"". (Contribuido por Emanuel Barry en bpo-26823.)

* La nueva función "PyErr_SetImportErrorSubclass()" permite
  especificar una subclase de "ImportError" para aumentar.
  (Contribuido por Eric Snow en bpo-15767.)

* La nueva función "PyErr_ResourceWarning()" se puede utilizar para
  generar un "ResourceWarning" que proporcione la fuente de la
  asignación de recursos. (Contribuido por Victor Stinner en
  bpo-26567.)

* La nueva función "PyOS_FSPath()" devuelve la representación del
  sistema de archivos de un *path-like object*. (Contribuido por Brett
  Cannon en bpo-27186.)

* Las funciones "PyUnicode_FSConverter()" y "PyUnicode_FSDecoder()"
  ahora aceptarán *path-like objects*.


Otras mejoras
=============

* Cuando "--version" (forma corta: "-V") se suministra dos veces,
  Python imprime "sys.version" para obtener información detallada.

     $ ./python -VV
     Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
     [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]


Obsoleto
========


Nuevas palabras clave
---------------------

No se recomienda el uso de "async" y "await" como nombres de variable,
clase, función o módulo. Introducidos por **PEP 492** en Python 3.5,
se convertirán en palabras clave adecuadas en Python 3.7. A partir de
Python 3.6, el uso de "async" o "await" como nombres lanzará un
"DeprecationWarning".


Comportamiento de Python obsoleto
---------------------------------

Al generar la excepción "StopIteration" dentro de un generador, ahora
se lanzará un "DeprecationWarning" y se activará un "RuntimeError" en
Python 3.7. Consulte PEP 479: Cambiar el gestor de StopIteration
dentro de generadores para obtener más detalles.

Ahora se espera que el método "__aiter__()" devuelva un iterador
asincrónico directamente en lugar de devolver un awaitable como antes.
Hacer lo primero activará un "DeprecationWarning". La compatibilidad
con versiones anteriores se eliminará en Python 3.7. (Contribuido por
Yury Selivanov en bpo-27243.)

Un par de caracteres de barra invertida que no es una secuencia de
escape válida ahora genera un "DeprecationWarning". Aunque
eventualmente se convertirá en un "SyntaxError", no será así para
varias versiones de Python. (Contribuido por Emanuel Barry en
bpo-27364.)

Al realizar una importación relativa, recurrir a "__name__" y
"__path__" desde el módulo de llamada cuando "__spec__" o
"__package__" no están definidos ahora genera un "ImportWarning".
(Contribuido por Rose Ames en bpo-25791.)


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


asynchat
~~~~~~~~

El "asynchat" ha quedado obsoleto en favor del "asyncio". (Contribuido
por Mariatta en bpo-25002.)


asyncore
~~~~~~~~

El "asyncore" ha quedado obsoleto en favor del "asyncio". (Contribuido
por Mariatta en bpo-25002.)


dbm
~~~

A diferencia de otras implementaciones de "dbm", el módulo "dbm.dumb"
crea bases de datos con el modo "'rw'" y permite modificar la base de
datos abierta con el modo "'r'". Este comportamiento ahora está en
desuso y se eliminará en 3.8. (Contribuido por Serhiy Storchaka en
bpo-21708.)


distutils
~~~~~~~~~

El argumento "extra_path" sin documentar para el constructor
"Distribution" ahora se considera obsoleto y lanzará una advertencia
si se establece. La compatibilidad con este parámetro se eliminará en
una futura versión de Python. Consulte bpo-27919 para obtener más
detalles.


grp
~~~

La compatibilidad con argumentos no enteros en "getgrgid()" ha quedado
obsoleta. (Contribuido por Serhiy Storchaka en bpo-26129.)


importlib
~~~~~~~~~

Los métodos "importlib.machinery.SourceFileLoader.load_module()" y
"importlib.machinery.SourcelessFileLoader.load_module()" ahora están
en desuso. Eran las únicas implementaciones restantes de
"importlib.abc.Loader.load_module()" en "importlib" que no habían
quedado obsoletas en versiones anteriores de Python a favor de
"importlib.abc.Loader.exec_module()".

La clase "importlib.machinery.WindowsRegistryFinder" ahora está en
desuso. A partir de 3.6.0, todavía se agrega a "sys.meta_path" de
forma predeterminada (en Windows), pero esto puede cambiar en
versiones futuras.


os
~~

El soporte no documentado de *bytes-like objects* general como rutas
en funciones "os", "compile()" y funciones similares ahora está en
desuso. (Contribuido por Serhiy Storchaka en bpo-25791 y bpo-26754.)


re
~~

La compatibilidad con indicadores en línea "(?letters)" en el medio de
la expresión regular ha quedado obsoleta y se eliminará en una versión
futura de Python. Aún se permiten las banderas al comienzo de una
expresión regular. (Contribuido por Serhiy Storchaka en bpo-22493.)


ssl
~~~

OpenSSL 0.9.8, 1.0.0 y 1.0.1 están obsoletos y ya no son compatibles.
En el futuro, el módulo "ssl" requerirá al menos OpenSSL 1.0.2 o
1.1.0.

Los argumentos relacionados con SSL como "certfile", "keyfile" y
"check_hostname" en "ftplib", "http.client", "imaplib", "poplib" y
"smtplib" se han desaprobado en favor de "context". (Contribuido por
Christian Heimes en bpo-28022.)

Un par de protocolos y funciones del módulo "ssl" ahora están en
desuso. Algunas funciones ya no estarán disponibles en futuras
versiones de OpenSSL. Otras funciones están obsoletas en favor de una
API diferente. (Contribuido por Christian Heimes en bpo-28022 y
bpo-26470.)


tkinter
~~~~~~~

El módulo "tkinter.tix" ahora está en desuso. Los usuarios de
"tkinter" deberían utilizar "tkinter.ttk" en su lugar.


venv
~~~~

La secuencia de comandos "pyvenv" se ha desaprobado en favor de
"python3 -m venv". Esto evita la confusión en cuanto a qué intérprete
de Python "pyvenv" está conectado y, por lo tanto, qué intérprete de
Python será utilizado por el entorno virtual. (Contribuido por Brett
Cannon en bpo-25154.)


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

Las funciones no documentadas "PyUnicode_AsEncodedObject()",
"PyUnicode_AsDecodedObject()", "PyUnicode_AsEncodedUnicode()" y
"PyUnicode_AsDecodedUnicode()" ahora están en desuso. En su lugar,
utilice el generic codec based API.


Opciones de compilación obsoletas
---------------------------------

El indicador de configuración "--with-system-ffi" ahora está activado
de forma predeterminada en plataformas UNIX que no son macOS. Puede
deshabilitarse mediante "--without-system-ffi", pero el uso de la
marca está obsoleto y no se aceptará en Python 3.7. macOS no se ve
afectado por este cambio. Tenga en cuenta que muchos distribuidores de
sistemas operativos ya utilizan el indicador "--with-system-ffi" al
crear su sistema Python.


Remoto
======


Eliminaciones de API y funciones
--------------------------------

* Los escapes desconocidos que constan de "'\'" y una letra ASCII en
  expresiones regulares ahora provocarán un error. En las plantillas
  de reemplazo para "re.sub()", todavía están permitidas, pero en
  desuso. La bandera "re.LOCALE" ahora solo se puede usar con patrones
  binarios.

* Se eliminó "inspect.getmoduleinfo()" (quedó en desuso desde CPython
  3.3). Se debe utilizar "inspect.getmodulename()" para obtener el
  nombre del módulo para una ruta determinada. (Contribuido por Yury
  Selivanov en bpo-13248.)

* La clase "traceback.Ignore" y los métodos "traceback.usage",
  "traceback.modname", "traceback.fullmodname",
  "traceback.find_lines_from_code", "traceback.find_lines",
  "traceback.find_strings", "traceback.find_executable_lines" se
  eliminaron del módulo "traceback". Eran métodos no documentados en
  desuso desde Python 3.2 y la funcionalidad equivalente está
  disponible en métodos privados.

* Se eliminaron los métodos ficticios "tk_menuBar()" y
  "tk_bindForTraversal()" en las clases de widgets "tkinter" (los
  comandos Tk correspondientes estaban obsoletos desde Tk 4.0).

* El método "open()" de la clase "zipfile.ZipFile" ya no admite el
  modo "'U'" (quedó obsoleto desde Python 3.4). Utilice
  "io.TextIOWrapper" para leer archivos de texto comprimidos en modo
  *universal newlines*.

* The undocumented "IN", "CDROM", "DLFCN", "TYPES", "CDIO", and
  "STROPTS" modules have been removed.  They had been available in the
  platform specific "Lib/plat-*/" directories, but were chronically
  out of date, inconsistently available across platforms, and
  unmaintained.  The script that created these modules is still
  available in the source distribution at Tools/scripts/h2py.py.

* Se ha eliminado la clase "asynchat.fifo" obsoleta.


Portar a Python 3.6
===================

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 del comando 'python'
-------------------------------------------------

* La salida de una compilación especial de Python con macros
  "COUNT_ALLOCS", "SHOW_ALLOC_COUNT" o "SHOW_TRACK_COUNT" definidas
  ahora está desactivada de forma predeterminada. Se puede volver a
  habilitar usando la opción "-X showalloccount". Ahora emite a
  "stderr" en lugar de "stdout". (Contribuido por Serhiy Storchaka en
  bpo-23034.)


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

* "open()" ya no permitirá combinar el indicador de modo "'U'" con
  "'+'". (Contribuido por Jeff Balogh y John O'Connor en bpo-2091.)

* "sqlite3" ya no confirma implícitamente una transacción abierta
  antes de las declaraciones DDL.

* En Linux, "os.urandom()" ahora se bloquea hasta que se inicializa el
  grupo de entropía aleatoria del sistema para aumentar la seguridad.

* Cuando se define "importlib.abc.Loader.exec_module()", también se
  debe definir "importlib.abc.Loader.create_module()".

* "PyErr_SetImportError()" ahora establece "TypeError" cuando su
  argumento **msg** no está establecido. Anteriormente, solo se
  devolvía "NULL".

* El formato del atributo "co_lnotab" de los objetos de código cambió
  para admitir un delta de número de línea negativo. De forma
  predeterminada, Python no emite un código de bytes con un delta de
  número de línea negativo. Las funciones que utilizan
  "frame.f_lineno", "PyFrame_GetLineNumber()" o "PyCode_Addr2Line()"
  no se ven afectadas. Las funciones que decodifican directamente
  "co_lnotab" deben actualizarse para usar un tipo entero de 8 bits
  con signo para el delta del número de línea, pero esto solo es
  necesario para admitir aplicaciones que usan un delta del número de
  línea negativo. Consulte "Objects/lnotab_notes.txt" para conocer el
  formato "co_lnotab" y cómo decodificarlo, y consulte **PEP 511**
  para conocer la justificación.

* Las funciones en el módulo "compileall" ahora devuelven booleanos en
  lugar de "1" o "0" para representar éxito o fracaso,
  respectivamente. Gracias a que los booleanos son una subclase de
  números enteros, esto solo debería ser un problema si estaba
  haciendo verificaciones de identidad para "1" o "0". Ver bpo-25768.

* La lectura del atributo "port" de los resultados de
  "urllib.parse.urlsplit()" y "urlparse()" ahora lanza "ValueError"
  para valores fuera de rango, en lugar de devolver "None". Ver
  bpo-20059.

* El módulo "imp" ahora lanza un "DeprecationWarning" en lugar de
  "PendingDeprecationWarning".

* Los siguientes módulos han tenido API faltantes agregadas a sus
  atributos "__all__" para que coincidan con las API documentadas:
  "calendar", "cgi", "csv", "ElementTree", "enum", "fileinput",
  "ftplib", "logging", "mailbox", "mimetypes", "optparse", "plistlib",
  "smtpd", "subprocess", "tarfile", "threading" y "wave". Esto
  significa que exportarán nuevos símbolos cuando se utilice "import
  *". (Contribuido por Joel Taddei y Jacek Kołodziej en bpo-23883.)

* Al realizar una importación relativa, si "__package__" no se compara
  igual que "__spec__.parent", entonces "ImportWarning" se lanza.
  (Contribuido por Brett Cannon en bpo-25791.)

* Cuando se realiza una importación relativa y no se conoce ningún
  paquete principal, se lanzará "ImportError". Anteriormente, se podía
  subir "SystemError". (Contribuido por Brett Cannon en bpo-18018.)

* Los servidores basados en el módulo "socketserver", incluidos los
  definidos en "http.server", "xmlrpc.server" y
  "wsgiref.simple_server", ahora solo detectan excepciones derivadas
  de "Exception". Por lo tanto, si un controlador de solicitudes lanza
  una excepción como "SystemExit" o "KeyboardInterrupt", ya no se
  llama a "handle_error()" y la excepción detendrá un servidor de un
  solo subproceso. (Contribuido por Martin Panter en bpo-23430.)

* "spwd.getspnam()" ahora lanza un "PermissionError" en lugar de
  "KeyError" si el usuario no tiene privilegios.

* El método "socket.socket.close()" ahora lanza una excepción si la
  llamada al sistema subyacente informó un error (por ejemplo,
  "EBADF"). (Contribuido por Martin Panter en bpo-26685.)

* El argumento *decode_data* para los constructores
  "smtpd.SMTPChannel" y "smtpd.SMTPServer" ahora es "False" por
  defecto. Esto significa que el argumento pasado a
  "process_message()" ahora es un objeto de bytes por defecto, y
  "process_message()" se pasarán argumentos de palabra clave. El
  código que ya se haya actualizado de acuerdo con la advertencia de
  obsolescencia generada por 3.5 no se verá afectado.

* Todos los argumentos opcionales de las funciones "dump()",
  "dumps()", "load()" y "loads()" y los constructores de clase
  "JSONEncoder" y "JSONDecoder" en el módulo "json" ahora son keyword-
  only. (Contribuido por Serhiy Storchaka en bpo-18726.)

* Es posible que las subclases de "type" que no anulan "type.__new__"
  ya no utilicen la forma de un argumento para obtener el tipo de un
  objeto.

* Como parte de **PEP 487**, el manejo de argumentos de palabras clave
  pasados a "type" (aparte de la sugerencia de metaclase, "metaclass")
  ahora se delega consistentemente en "object.__init_subclass__()".
  Esto significa que "type.__new__()" y "type.__init__()" ahora
  aceptan argumentos de palabras clave arbitrarias, pero
  "object.__init_subclass__()" (que se llama desde "type.__new__()")
  los rechazará de forma predeterminada. Las metaclases personalizadas
  que acepten argumentos de palabras clave adicionales deberán ajustar
  sus llamadas a "type.__new__()" (ya sea directa o mediante "super")
  en consecuencia.

* En "distutils.command.sdist.sdist", el atributo "default_format" se
  ha eliminado y ya no se respeta. En cambio, el formato de archivo
  tar comprimido con gzip es el predeterminado en todas las
  plataformas y no se realiza ninguna selección específica de la
  plataforma. En entornos donde las distribuciones se construyen en
  Windows y se requieren distribuciones zip, configure el proyecto con
  un archivo "setup.cfg" que contenga lo siguiente:

     [sdist]
     formats=zip

  Este comportamiento también ha sido actualizado a versiones
  anteriores de Python por Setuptools 26.0.0.

* En el módulo "urllib.request" y el método
  "http.client.HTTPConnection.request()", si no se ha especificado
  ningún campo de encabezado Content-Length y el cuerpo de la
  solicitud es un objeto de archivo, ahora se envía con codificación
  fragmentada HTTP 1.1. Si un objeto de archivo debe enviarse a un
  servidor HTTP 1.0, la persona que llama ahora debe especificar el
  valor de Longitud de contenido. (Contribuido por Demian Brecht y
  Rolf Krahl con ajustes de Martin Panter en bpo-12319.)

* El "DictReader" ahora devuelve filas de tipo "OrderedDict".
  (Contribuido por Steve Holden en bpo-27842.)

* El "crypt.METHOD_CRYPT" ya no se agregará a "crypt.methods" si la
  plataforma no lo admite. (Contribuido por Victor Stinner en
  bpo-25287.)

* Los argumentos *verbose* and *rename* para "namedtuple()" ahora son
  solo palabras clave. (Contribuido por Raymond Hettinger en
  bpo-25628.)

* En Linux, "ctypes.util.find_library()" ahora busca bibliotecas
  compartidas en "LD_LIBRARY_PATH". (Contribuido por Vinay Sajip en
  bpo-9998.)

* La clase "imaplib.IMAP4" ahora maneja banderas que contienen el
  carácter "']'" en mensajes enviados desde el servidor para mejorar
  la compatibilidad en el mundo real. (Contribuido por Lita Cho en
  bpo-21815.)

* La función "mmap.write()" ahora devuelve el número de bytes escritos
  como otros métodos de escritura. (Contribuido por Jakub Stasiak en
  bpo-26335.)

* Las funciones "pkgutil.iter_modules()" y "pkgutil.walk_packages()"
  ahora devuelven tuplas con nombre "ModuleInfo". (Contribuido por
  Ramchandra Apte en bpo-17211.)

* "re.sub()" ahora lanza un error para referencias de grupos numéricos
  no válidos en plantillas de reemplazo, incluso si el patrón no se
  encuentra en la cadena. El mensaje de error para referencias de
  grupo no válidas ahora incluye el índice de grupo y la posición de
  la referencia. (Contribuido por SilentGhost, Serhiy Storchaka en
  bpo-25953.)

* "zipfile.ZipFile" ahora lanzará "NotImplementedError" para valores
  de compresión no reconocidos. Anteriormente se planteó un
  "RuntimeError" simple. Además, llamar a los métodos "ZipFile" en un
  ZipFile cerrado o llamar al método "write()" en un ZipFile creado
  con el modo "'r'" lanzará un "ValueError". Anteriormente, se planteó
  un "RuntimeError" en esos escenarios.

* cuando las metaclases personalizadas se combinan con "super()" de
  argumento cero o referencias directas de métodos a la variable de
  cierre "__class__" implícita, la entrada de espacio de nombres
  "__classcell__" implícita ahora debe pasarse a "type.__new__" para
  la inicialización. No hacerlo resultará en un "DeprecationWarning"
  en Python 3.6 y un "RuntimeError" en Python 3.8.

* Con la introducción de "ModuleNotFoundError", los consumidores del
  sistema de importación pueden comenzar a esperar que los reemplazos
  del sistema de importación generen esa excepción más específica
  cuando corresponda, en lugar de que el "ImportError". Para proveer
  compatibilidad futura con dichos consumidores, los implementadores
  de un sistema alternativo de importación que completamente
  reemplacen "__import__()" necesitarán actualizar su implementación
  para lanzar la nueva subclase cundo un módulo no puede ser
  encontrado.. Los implementadores de complementos compatibles con el
  sistema de importación predeterminado no deberían necesitar realizar
  ningún cambio, ya que el sistema de importación predeterminado
  lanzará la nueva subclase cuando sea apropiado.


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

* La familia de asignadores "PyMem_Malloc()" ahora usa el pymalloc
  allocator en lugar del sistema "malloc()". Las aplicaciones que
  llaman a "PyMem_Malloc()" sin sostener el GIL ahora pueden fallar.
  Establezca la variable de entorno "PYTHONMALLOC" en "debug" para
  validar el uso de asignadores de memoria en su aplicación. Ver
  bpo-26249.

* "Py_Exit()" (y el intérprete principal) ahora anula el estado de
  salida con 120 si fallaron los datos almacenados en el búfer. Ver
  bpo-5319.


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

Ha habido varios cambios importantes en el *bytecode* en Python 3.6.

* El intérprete de Python ahora usa un código de palabra de 16 bits en
  lugar de un código de bytes. (Contribuido por Demur Rumed con
  aportes y reseñas de Serhiy Storchaka y Victor Stinner en bpo-26647
  y bpo-28050.)

* Los nuevos códigos de operación "FORMAT_VALUE" y "BUILD_STRING" como
  parte de la implementación de formatted string literal. (Contribuido
  por Eric Smith en bpo-25483 y Serhiy Storchaka en bpo-27078.)

* El nuevo "BUILD_CONST_KEY_MAP" opcode para optimizar la creación de
  diccionarios con claves constantes. (Contribuido por Serhiy
  Storchaka en bpo-27140.)

* Los códigos de operación de llamada de función se han rediseñado en
  gran medida para un mejor rendimiento y una implementación más
  simple. Se han modificado los códigos de operación "MAKE_FUNCTION",
  "CALL_FUNCTION", "CALL_FUNCTION_KW" y "BUILD_MAP_UNPACK_WITH_CALL",
  se han agregado los nuevos códigos de operación "CALL_FUNCTION_EX" y
  "BUILD_TUPLE_UNPACK_WITH_CALL" y se han eliminado los códigos de
  operación "CALL_FUNCTION_VAR", "CALL_FUNCTION_VAR_KW" y
  "MAKE_CLOSURE". (Contribuido por Demur Rumed en bpo-27095 y Serhiy
  Storchaka en bpo-27213, bpo-28257.)

* Se han agregado los nuevos códigos de operación "SETUP_ANNOTATIONS"
  y "STORE_ANNOTATION" para admitir la nueva sintaxis *variable
  annotation*. (Contribuido por Ivan Levkivskyi en bpo-27985.)


Cambios notables en Python 3.6.2
================================


Nuevo objetivo de compilación "make regen-all"
----------------------------------------------

Para simplificar la compilación cruzada y garantizar que CPython se
pueda compilar de manera confiable sin requerir que una versión
existente de Python ya esté disponible, el sistema de compilación
basado en autotools ya no intenta volver a compilar implícitamente los
archivos generados en función de los tiempos de modificación del
archivo.

En su lugar, se ha agregado un nuevo comando "make regen-all" para
forzar la regeneración de estos archivos cuando se desee (por ejemplo,
después de que ya se haya creado una versión inicial de Python basada
en las versiones pregeneradas).

También se definen objetivos de regeneración más selectivos; consulte:
fuente: *Makefile.pre.in* para obtener más detalles.

(Contribuido por Victor Stinner en bpo-23404.)

Nuevo en la versión 3.6.2.


Eliminación del objetivo de compilación "make touch"
----------------------------------------------------

Se ha eliminado el objetivo de compilación "make touch" que se
utilizaba anteriormente para solicitar la regeneración implícita de
archivos generados mediante la actualización de sus tiempos de
modificación.

Ha sido reemplazado por el nuevo objetivo "make regen-all".

(Contribuido por Victor Stinner en bpo-23404.)

Distinto en la versión 3.6.2.


Cambios notables en Python 3.6.4
================================

El singleton "PyExc_RecursionErrorInst" que formaba parte de la API
pública se ha eliminado ya que sus miembros nunca borrados pueden
causar una falla de segmentación durante la finalización del
intérprete. (Contribuido por Xavier de Gaye en bpo-22898 y bpo-30697.)


Cambios notables en Python 3.6.5
================================

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


Cambios notables en Python 3.6.7
================================

En 3.6.7, el módulo "tokenize" ahora emite implícitamente 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.6.10
=================================

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


Cambios notables en Python 3.6.13
=================================

Las versiones anteriores de Python permitían el uso de ";" y "&" como
separadores de parámetros de consulta en "urllib.parse.parse_qs()" y
"urllib.parse.parse_qsl()". Debido a problemas de seguridad y para
cumplir con las recomendaciones más recientes del W3C, esto se ha
cambiado para permitir solo una clave separadora, con "&" como
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.)
