# 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

La clase `contextlib.AbstractContextManager` fue agregada para proveer una clase abstracta para gestores de contexto. Provee una implementación por defecto sensible para __enter__() que retorna `self` y deja un método abstracto __exit__(). Se ha agregado una clase coincidente al módulo `typing` como `typing.ContextManager`. (Contribuido por Brett Cannon en 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

Al especificar rutas para agregar a `sys.path` en un archivo .pth, ahora puede especificar rutas de archivo en la parte superior de los directorios (por ejemplo, archivos zip). (Contribuido por Wolfgang Langner en 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.)

Se agregaron las nuevas constantes de Linux `TCP_USER_TIMEOUT` y `TCP_CONGESTION`. (Contribuido por Omar Sandoval, número: 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

El módulo `unicodedata` ahora usa datos de Unicode 9.0.0. (Contribuido por 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.)