Qué hay de nuevo en 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:

Mejoras en la implementación de CPython:

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 la documentación para obtener más información.

  • Un archivo python36.zip ahora funciona como un punto de referencia para inferir PYTHONHOME. Consulte la documentación 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.

Tools that use or will use the new syntax: 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.

The string formatting language also now has support for the '_' option to signal the use of an underscore for a thousands separator for floating-point presentation types and for integer presentation type 'd'. For integer presentation types 'b', 'o', 'x', and 'X', underscores will be inserted every 4 digits:

>>> '{:_}'.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.

Prior to Python 3.6, data loss could result when using bytes paths on Windows. With this change, using bytes to represent paths is now supported on Windows, provided those bytes are encoded with the encoding returned by sys.getfilesystemencoding(), which now defaults to 'utf-8'.

Applications that do not use str to represent paths should use os.fsencode() and os.fsdecode() to ensure their bytes are correctly encoded. To revert to the previous behaviour, set PYTHONLEGACYWINDOWSFSENCODING or call 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

Attributes in a class definition body have a natural ordering: the same order in which the names appear in the source. This order is now preserved in the new class’s __dict__ attribute.

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

  • Check that the GIL is held when allocator functions of PYMEM_DOMAIN_OBJ (ex: PyObject_Malloc()) and PYMEM_DOMAIN_MEM (ex: PyMem_Malloc()) domains are called.

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 bpo-26516 y :issue:` 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 bpo-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 bpo-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 bpo-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 bpo-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 bpo-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

Note that the pseudo-random generators in the random module should NOT be used for security purposes. Use secrets on Python 3.6+ and os.urandom() on Python 3.5 and earlier.

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

The namedtuple() function now accepts an optional keyword argument module, which, when specified, is used for the __module__ attribute of the returned named tuple class. (Contributed by Raymond Hettinger in 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

The default_format attribute has been removed from distutils.command.sdist.sdist and the formats attribute defaults to ['gztar']. Although not anticipated, any code relying on the presence of default_format may need to be adapted. See bpo-27819 for more details.

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() now outputs the implicit memo index for the MEMOIZE opcode. (Contributed by Serhiy Storchaka in 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

The ioctl() function now supports the SIO_LOOPBACK_FAST_PATH control code. (Contributed by Daniel Stokes in 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.)

The socket module now supports the address family AF_ALG to interface with Linux Kernel crypto API. ALG_*, SOL_ALG and sendmsg_afalg() were added. (Contributed by Christian Heimes in bpo-27744 with support from Victor Stinner.)

Se agregaron las nuevas constantes de Linux TCP_USER_TIMEOUT y TCP_CONGESTION. (Contribuido por 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.)

Added ssl.SSLContext.post_handshake_auth to enable and ssl.SSLSocket.verify_client_post_handshake() to initiate TLS 1.3 post-handshake authentication. (Contributed by Christian Heimes in gh-78851.)

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:

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

  • Allocator functions of the PyMem_Malloc() domain (PYMEM_DOMAIN_MEM) now use the pymalloc memory allocator instead of malloc() function of the C library. The pymalloc allocator is optimized for objects smaller or equal to 512 bytes with a short lifetime, and use malloc() for larger memory blocks. (Contributed by Victor Stinner in 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.)

  • The GIL must now be held when allocator functions of PYMEM_DOMAIN_OBJ (ex: PyObject_Malloc()) and PYMEM_DOMAIN_MEM (ex: PyMem_Malloc()) domains are called.

  • 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

The asynchat has been deprecated in favor of asyncio. (Contributed by Mariatta in bpo-25002.)

asyncore

The asyncore has been deprecated in favor of asyncio. (Contributed by Mariatta in 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

The undocumented extra_path argument to the distutils.Distribution constructor is now considered deprecated and will raise a warning if set. Support for this parameter will be removed in a future Python release. See bpo-27919 for details.

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

The importlib.machinery.WindowsRegistryFinder class is now deprecated. As of 3.6.0, it is still added to sys.meta_path by default (on Windows), but this may change in future releases.

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

xml

  • As mitigation against DTD and external entity retrieval, the xml.dom.minidom and xml.sax modules no longer process external entities by default. (Contributed by Christian Heimes in gh-61441.)

Funciones y tipos obsoletos de la API de C

Undocumented functions PyUnicode_AsEncodedObject(), PyUnicode_AsDecodedObject(), PyUnicode_AsEncodedUnicode() and PyUnicode_AsDecodedUnicode() are deprecated now. Use the generic codec based API instead.

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.

  • Los módulos indocumentados IN, CDROM, DLFCN, TYPES, CDIO y STROPTS se han eliminado. Habían estado disponibles en los directorios Lib/plat-*/ específicos de la plataforma, pero estaban desactualizados de forma crónica, estaban disponibles de manera incoherente en todas las plataformas y no se mantenían. El script que creó estos módulos todavía está disponible en la distribución fuente en: source: 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.

  • The format of the co_lnotab attribute of code objects changed to support a negative line number delta. By default, Python does not emit bytecode with a negative line number delta. Functions using frame.f_lineno, PyFrame_GetLineNumber() or PyCode_Addr2Line() are not affected. Functions directly decoding co_lnotab should be updated to use a signed 8-bit integer type for the line number delta, but this is only required to support applications using a negative line number delta. See Objects/lnotab_notes.txt for the co_lnotab format and how to decode it, and see the PEP 511 for the rationale.

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

  • The imp module now raises a DeprecationWarning instead of PendingDeprecationWarning.

  • The following modules have had missing APIs added to their __all__ attributes to match the documented APIs: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threading and wave. This means they will export new symbols when import * is used. (Contributed by Joel Taddei and Jacek Kołodziej in 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.)

  • The decode_data argument for the smtpd.SMTPChannel and smtpd.SMTPServer constructors is now False by default. This means that the argument passed to process_message() is now a bytes object by default, and process_message() will be passed keyword arguments. Code that has already been updated in accordance with the deprecation warning generated by 3.5 will not be affected.

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

  • In distutils.command.sdist.sdist, the default_format attribute has been removed and is no longer honored. Instead, the gzipped tarfile format is the default on all platforms and no platform-specific selection is made. In environments where distributions are built on Windows and zip distributions are required, configure the project with a setup.cfg file containing the following:

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

  • With the introduction of ModuleNotFoundError, import system consumers may start expecting import system replacements to raise that more specific exception when appropriate, rather than the less-specific ImportError. To provide future compatibility with such consumers, implementers of alternative import systems that completely replace __import__() will need to update their implementations to raise the new subclass when a module can’t be found at all. Implementers of compliant plugins to the default import system shouldn’t need to make any changes, as the default import system will raise the new subclass when appropriate.

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

  • The function call opcodes have been heavily reworked for better performance and simpler implementation. The MAKE_FUNCTION, CALL_FUNCTION, CALL_FUNCTION_KW and BUILD_MAP_UNPACK_WITH_CALL opcodes have been modified, the new CALL_FUNCTION_EX and BUILD_TUPLE_UNPACK_WITH_CALL have been added, and CALL_FUNCTION_VAR, CALL_FUNCTION_VAR_KW and MAKE_CLOSURE opcodes have been removed. (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)

  • The new SETUP_ANNOTATIONS and STORE_ANNOTATION opcodes have been added to support the new variable annotation syntax. (Contributed by Ivan Levkivskyi in 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.)

Added in version 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

xml.dom.minidom and xml.sax modules no longer process external entities by default. See also gh-61441.

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

Notable changes in Python 3.6.14

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

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