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:
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óduloasyncio
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 paraResourceWarning
, 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
yssl
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 clavesscrypt()
.
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
ypythonw.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 inferirPYTHONHOME
. 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.
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__
.
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.
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.
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 porPyMem_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()
) yPYMEM_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
ononlocal
ahora debe aparecer textualmente antes del primer uso del nombre afectado en el mismo ámbito. Anteriormente, este era unSyntaxWarning
.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__()
enNone
, 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 deImportError
) 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, comoloop.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ónasyncio.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óngetaddrinfo
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ónStopIteration
. (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
yTask
ahora tienen una implementación C optimizada que hace que el código asyncio sea hasta un 30% más rápido. (Contribuido por Yury Selivanov e INADA Naoki en bpo-26081 y bpo-28544.)
binascii¶
La función b2a_base64()
ahora acepta un argumento de palabra clave newline opcional para controlar si el carácter de nueva línea se agrega al valor de retorno. (Contribuido por Victor Stinner en bpo-25357.)
cmath¶
Se ha agregado la nueva constante cmath.tau
(τ). (Contribuido por Lisa Roach en bpo-12345, consulte PEP 628 para obtener más detalles).
Nuevas constantes: cmath.inf
y cmath.nan
para que coincidan con math.inf
y math.nan
, y también cmath.infj
y cmath.nanj
para que coincidan con el formato utilizado por la repetición compleja. (Contribuido por Mark Dickinson en bpo-23229.)
colecciones¶
Se ha agregado la nueva clase base abstracta Collection
para representar clases de contenedores iterables de tamaño. (Contribuido por Ivan Levkivskyi, documentos de Neil Girdhar en bpo-27598.)
La nueva clase base abstracta Reversible
. representa clases iterables que también proveen el método __reversed__()
.(Contribuido por Ivan Levkivskyi en bpo-25987.)
La nueva clase base abstracta AsyncGenerator
representa generadores asincrónicos. (Contribuido por Yury Selivanov en bpo-28720.)
La función namedtuple()
ahora acepta un argumento de palabra clave opcional module, que, cuando se especifica, se utiliza para el atributo __module__
de la clase de tupla con nombre devuelto. (Contribuido por Raymond Hettinger en bpo-17941.)
Los argumentos verbose and rename para namedtuple()
ahora son solo palabras clave. (Contribuido por Raymond Hettinger en bpo-25628.)
Las instancias de collections.deque
recursivas ahora se pueden eliminar. (Contribuido por Serhiy Storchaka en bpo-26482.)
Futuros concurrentes¶
El constructor de la clase ThreadPoolExecutor
ahora acepta un argumento thread_name_prefix opcional para que sea posible personalizar los nombres de los subprocesos creados por el grupo. (Contribuido por Gregory P. Smith en bpo-27664.)
contextlib¶
The contextlib.AbstractContextManager
class has been added to
provide an abstract base class for context managers. It provides a
sensible default implementation for __enter__()
which returns
self
and leaves __exit__()
an abstract method. A matching
class has been added to the typing
module as
typing.ContextManager
.
(Contributed by Brett Cannon in bpo-25609.)
fecha y hora¶
Las clases datetime
y time
tienen el nuevo atributo fold
utilizado para eliminar la ambigüedad de la hora local cuando sea necesario. Muchas funciones en el datetime
se han actualizado para admitir la desambiguación de la hora local. Consulte la sección Local Time Disambiguation para obtener más información. (Contribuido por Alexander Belopolsky en bpo-24773.)
Los métodos datetime.strftime()
y date.strftime()
ahora admiten las directivas de fecha ISO 8601 %G
, %u
y %V
. (Contribuido por Ashley Anderson en bpo-12006.)
La función datetime.isoformat()
ahora acepta un argumento timespec opcional que especifica el número de componentes adicionales del valor de tiempo a incluir. (Contribuido por Alessandro Cucci y Alexander Belopolsky en bpo-19475.)
El datetime.combine()
ahora acepta un argumento tzinfo opcional. (Contribuido por Alexander Belopolsky en bpo-27661.)
decimal¶
Nuevo método Decimal.as_integer_ratio()
que devuelve un par (n, d)
de enteros que representan la instancia Decimal
dada como una fracción, en términos más bajos y con un denominador positivo:
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(Contribuido por Stefan Krah y Mark Dickinson en bpo-25928.)
distutils¶
El atributo default_format
se ha eliminado de distutils.command.sdist.sdist
y el atributo formats
se establece por defecto en ['gztar']
. Aunque no está previsto, es posible que sea necesario adaptar cualquier código que dependa de la presencia de default_format
. Consulte bpo-27819 para obtener más detalles.
Email¶
La nueva API de correo electrónico, habilitada a través de la palabra clave policy para varios constructores, ya no es provisional. La documentación de email
se ha reorganizado y reescrito para centrarse en la nueva API, conservando la documentación anterior para la API heredada. (Contribuido por R. David Murray en bpo-24277.)
Las clases email.mime
ahora aceptan todas una palabra clave policy opcional. (Contribuido por Berker Peksag en bpo-27331.)
El DecodedGenerator
ahora admite la palabra clave policy.
Hay un nuevo atributo policy
, message_factory
, que controla qué clase se usa por defecto cuando el analizador crea nuevos objetos de mensaje. Para la política email.policy.compat32
, es Message
, para las nuevas políticas es EmailMessage
. (Contribuido por R. David Murray en bpo-20476.)
codificaciones¶
En Windows, se agregó la codificación 'oem'
para usar CP_OEMCP
y el alias 'ansi'
para la codificación 'mbcs'
existente, que usa la página de códigos CP_ACP
. (Contribuido por Steve Dower en bpo-27959.)
enumeración¶
Se han agregado dos nuevas clases base de enumeración al módulo enum
: Flag
y IntFlags
. Ambos se utilizan para definir constantes que se pueden combinar utilizando los operadores bit a bit. (Contribuido por Ethan Furman en bpo-23591.)
Muchos módulos de biblioteca estándar se han actualizado para usar la clase IntFlags
para sus constantes.
El nuevo valor de enum.auto
se puede utilizar para asignar valores a los miembros de enumeración automáticamente:
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
manipulador de faltas¶
En Windows, el módulo faulthandler
ahora instala un controlador para las excepciones de Windows: consulte faulthandler.enable()
. (Contribuido por Victor Stinner en bpo-23848.)
entrada de archivo¶
hook_encoded()
ahora admite el argumento errors. (Contribuido por Joseph Hackman en bpo-25788.)
hashlib¶
hashlib
es compatible con OpenSSL 1.1.0. La versión mínima recomendada es 1.0.2. (Contribuido por Christian Heimes en bpo-26470.)
Se agregaron funciones hash BLAKE2 al módulo. blake2b()
y blake2s()
siempre están disponibles y admiten el conjunto completo de funciones de BLAKE2. (Contribuido por Christian Heimes en bpo-26798 basado en código de Dmitry Chestnykh y Samuel Neves. Documentación escrita por Dmitry Chestnykh.)
Se agregaron las funciones hash SHA-3 sha3_224()
, sha3_256()
, sha3_384()
, sha3_512()
y las funciones hash SHAKE shake_128()
y shake_256()
. (Contribuido por Christian Heimes en bpo-16113. Paquete de código Keccak por Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche y Ronny Van Keer.)
La función de derivación de claves basada en contraseña scrypt()
ahora está disponible con OpenSSL 1.1.0 y versiones posteriores. (Contribuido por Christian Heimes en bpo-27928.)
http.client¶
HTTPConnection.request()
y endheaders()
ahora admiten cuerpos de solicitud de codificación fragmentados. (Contribuido por Demian Brecht y Rolf Krahl en bpo-12319.)
idlelib y IDLE¶
El paquete idlelib se está modernizando y refactorizando para que IDLE se vea y funcione mejor y para que el código sea más fácil de entender, probar y mejorar. Parte de hacer que IDLE se vea mejor, especialmente en Linux y Mac, es usar widgets ttk, principalmente en los cuadros de diálogo. Como resultado, IDLE ya no se ejecuta con tcl / tk 8.4. Ahora requiere tcl / tk 8.5 o 8.6. Recomendamos ejecutar la última versión de cualquiera.
La “modernización” incluye el cambio de nombre y la consolidación de módulos idlelib. El cambio de nombre de archivos con nombres en mayúsculas parciales es similar al cambio de nombre de, por ejemplo, Tkinter y TkFont a tkinter y tkinter.font en 3.0. Como resultado, las importaciones de archivos idlelib que funcionaban en 3.5 normalmente no funcionarán en 3.6. Se necesitará al menos un cambio de nombre de módulo (ver idlelib / README.txt), a veces más. (Los cambios de nombre aportados por Al Swiegart y Terry Reedy en bpo-24225. La mayoría de los parches idlelib desde entonces han sido y serán parte del proceso).
En compensación, el resultado final será que algunas clases de idlelib serán más fáciles de usar, con mejores API y cadenas de documentación que las expliquen. Se agregará información útil adicional a idlelib cuando esté disponible.
Nuevo en 3.6.2:
Varias correcciones para autocompletar. (Contribuido por Louie Lu en bpo-15786.)
Nuevo en 3.6.3:
El Explorador de módulos (en el menú Archivo, antes llamado Explorador de clases), ahora muestra funciones y clases anidadas además de funciones y clases de nivel superior. (Contribuido por Guilherme Polo, Cheryl Sabella y Terry Jan Reedy en bpo-1612262.)
Las funciones IDLE implementadas anteriormente como extensiones se han vuelto a implementar como funciones normales. Su configuración se ha movido de la pestaña Extensiones a otras pestañas de diálogo. (Contribuido por Charles Wohlganger y Terry Jan Reedy en bpo-27099.)
El cuadro de diálogo Configuración (Opciones, Configurar IDLE) se ha reescrito parcialmente para mejorar tanto la apariencia como la función. (Contribuido por Cheryl Sabella y Terry Jan Reedy en varios números).
Nuevo en 3.6.4:
La muestra de fuente ahora incluye una selección de caracteres no latinos para que los usuarios puedan ver mejor el efecto de seleccionar una fuente en particular. (Contribuido por Terry Jan Reedy en bpo-13802.) La muestra se puede editar para incluir otros caracteres. (Contribuido por Serhiy Storchaka en bpo-31860.)
Nuevo en 3.6.6:
Se revisó la opción de contexto del código del editor. El cuadro muestra todas las líneas de contexto hasta las líneas máximas. Al hacer clic en una línea de contexto, el editor salta a esa línea. Los colores de contexto para temas personalizados se agregan a la pestaña Destacados del cuadro de diálogo Configuración. (Contribuido por Cheryl Sabella y Terry Jan Reedy en bpo-33642, bpo-33768 y bpo-33679.)
En Windows, una nueva llamada a la API le dice a Windows que tk escala para DPI. En Windows 8.1+ o 10, con las propiedades de compatibilidad de DPI del binario de Python sin cambios y una resolución de monitor superior a 96 DPI, esto debería hacer que el texto y las líneas sean más nítidos. De lo contrario, no debería tener ningún efecto. (Contribuido por Terry Jan Reedy en bpo-33656.)
Nuevo en 3.6.7:
La salida sobre N líneas (50 por defecto) se reduce a un botón. N se puede cambiar en la sección PyShell de la página General del cuadro de diálogo Configuración. Se pueden comprimir menos líneas, pero posiblemente más largas, haciendo clic derecho en la salida. La salida comprimida se puede expandir en su lugar haciendo doble clic en el botón o en el portapapeles o en una ventana separada haciendo clic derecho en el botón. (Contribuido por Tal Einat en bpo-1529353.)
importlib¶
Importar ahora lanza la nueva excepción ModuleNotFoundError
(subclase de ImportError
) cuando no puede encontrar un módulo. Codifique que las comprobaciones actuales para ImportError
(en try-except) seguirán funcionando. (Contribuido por Eric Snow en bpo-15767.)
importlib.util.LazyLoader
ahora llama a create_module()
en el cargador envuelto, eliminando la restricción de que importlib.machinery.BuiltinImporter
y importlib.machinery.ExtensionFileLoader
no se pueden usar con importlib.util.LazyLoader
.
importlib.util.cache_from_source()
, importlib.util.source_from_cache()
y importlib.util.spec_from_file_location()
ahora aceptan un path-like object.
inspeccionar¶
La función inspect.signature()
ahora reporta los parámetros .0
implícitos generados por el compilador para los alcances de comprensión y expresión del generador como si fueran parámetros solo posicionales llamados implicit0
. (Contribuido por Jelle Zijlstra en bpo-19611.)
Para reducir la pérdida de código al actualizar desde Python 2.7 y la API inspect.getargspec()
heredada, se ha revertido la desaprobación previamente documentada de inspect.getfullargspec()
. Si bien esta función es conveniente para bases de código Python 2/3 de fuente única / fuente, la interfaz inspect.signature()
más rica sigue siendo el enfoque recomendado para el nuevo código. (Contribuido por Nick Coghlan en bpo-27172)
json¶
json.load()
y json.loads()
ahora admiten entrada binaria. El JSON codificado debe representarse mediante UTF-8, UTF-16 o UTF-32. (Contribuido por Serhiy Storchaka en bpo-17909.)
Inicio sesión¶
Se agregó el nuevo método WatchedFileHandler.reopenIfNeeded()
para agregar la capacidad de verificar si es necesario volver a abrir el archivo de registro. (Contribuido por Marian Horban en bpo-24884.)
Matemáticas¶
La constante tau (τ) se ha agregado a los módulos math
y cmath
. (Contribuido por Lisa Roach en bpo-12345, consulte PEP 628 para obtener más detalles).
multiprocesamiento¶
Proxy Objects devuelto por multiprocessing.Manager()
ahora se puede anidar. (Contribuido por Davin Potts en bpo-6766.)
os¶
Consulte el resumen de PEP 519 para obtener detalles sobre cómo los módulos os
y os.path
ahora admiten path-like objects.
scandir()
ahora admite rutas bytes
en Windows.
Un nuevo método close()
permite cerrar explícitamente un iterador scandir()
. El iterador scandir()
ahora admite el protocolo context manager. Si un iterador scandir()
no se agota ni se cierra explícitamente, se emitirá un ResourceWarning
en su destructor. (Contribuido por Serhiy Storchaka en bpo-25994.)
En Linux, os.urandom()
ahora se bloquea hasta que se inicializa el grupo de entropía aleatoria del sistema para aumentar la seguridad. Consulte el PEP 524 para conocer la justificación.
El syscall de Linux getrandom()
(obtener bytes aleatorios) ahora se expone como la nueva función os.getrandom()
. (Contribuido por Victor Stinner, parte del PEP 524)
Pathlib¶
pathlib
ahora es compatible con path-like objects. (Contribuido por Brett Cannon en bpo-27186.)
Consulte el resumen de PEP 519 para obtener más detalles.
pdb¶
El constructor de la clase Pdb
tiene un nuevo argumento readrc opcional para controlar si se deben leer los archivos .pdbrc
.
pepinillo¶
Los objetos que necesitan que se llame a __new__
con argumentos de palabras clave ahora se pueden seleccionar utilizando pickle protocols anterior a la versión del protocolo 4. La versión 4 del protocolo ya es compatible con este caso. (Contribuido por Serhiy Storchaka en bpo-24164.)
pepinillos¶
pickletools.dis()
ahora genera el índice de memo implícito para el código de operación MEMOIZE
. (Contribuido por Serhiy Storchaka en bpo-25382.)
Pydoc¶
El módulo pydoc
ha aprendido a respetar la variable de entorno MANPAGER
. (Contribuido por Matthias Klose en bpo-8637.)
help()
y pydoc
ahora pueden enumerar campos de tupla con nombre en el orden en que se definieron en lugar de alfabéticamente. (Contribuido por Raymond Hettinger en bpo-24879.)
aleatorio¶
La nueva función choices()
devuelve una lista de elementos de tamaño especificado de la población dada con pesos opcionales. (Contribuido por Raymond Hettinger en bpo-18844.)
re¶
Se agregó soporte para lapsos de modificadores en expresiones regulares. Ejemplos: '(?i:p)ython'
coincide con 'python'
y 'Python'
, pero no con 'PYTHON'
; '(?i)g(?-i:v)r'
coincide con 'GvR'
y 'gvr'
, pero no con 'GVR'
. (Contribuido por Serhiy Storchaka en bpo-433028.)
Se puede acceder a los grupos de objetos coincidentes mediante __getitem__
, que es equivalente a group()
. Entonces mo['name']
ahora es equivalente a mo.group('name')
. (Contribuido por Eric Smith en bpo-24454.)
Los objetos Match
ahora admiten index-like objects
como índices de grupo. (Contribuido por Jeroen Demeyer y Xiang Zhang en bpo-27177.)
readline¶
Se agregó set_auto_history()
para habilitar o deshabilitar la adición automática de entradas a la lista del historial. (Contribuido por Tyler Crompton en bpo-26870.)
rlcompleter¶
Los nombres de atributos privados y especiales ahora se omiten a menos que el prefijo comience con guiones bajos. Se agrega un espacio o dos puntos después de algunas palabras clave completadas. (Contribuido por Serhiy Storchaka en bpo-25011 y bpo-25209.)
shlex¶
El shlex
tiene mucho improved shell compatibility a través del nuevo argumento punctuation_chars para controlar qué caracteres se tratan como puntuación. (Contribuido por Vinay Sajip en bpo-1521950.)
sitio¶
When specifying paths to add to sys.path
in a .pth
file,
you may now specify file paths on top of directories (e.g. zip files).
(Contributed by Wolfgang Langner in bpo-26587).
sqlite3¶
sqlite3.Cursor.lastrowid
ahora admite la declaración REPLACE
. (Contribuido por Alex LordThorsen en bpo-16864.)
enchufe¶
La función ioctl()
ahora admite el código de control SIO_LOOPBACK_FAST_PATH
. (Contribuido por Daniel Stokes en bpo-26536.)
Las constantes getsockopt()
SO_DOMAIN
, SO_PROTOCOL
, SO_PEERSEC
y SO_PASSSEC
ahora son compatibles. (Contribuido por Christian Heimes en bpo-26907.)
El setsockopt()
ahora admite el formulario setsockopt(level, optname, None, optlen: int)
. (Contribuido por Christian Heimes en bpo-27744.)
El módulo de socket ahora admite la familia de direcciones AF_ALG
para interactuar con la API de cifrado del kernel de Linux. Se agregaron ALG_*
, SOL_ALG
y sendmsg_afalg()
. (Contribuido por Christian Heimes en bpo-27744 con el apoyo de Victor Stinner.)
New Linux constants TCP_USER_TIMEOUT
and TCP_CONGESTION
were added.
(Contributed by Omar Sandoval, bpo-26273).
servidor de sockets¶
Los servidores basados en el módulo socketserver
, incluidos los definidos en http.server
, xmlrpc.server
y wsgiref.simple_server
, ahora admiten el protocolo context manager. (Contribuido por Aviv Palivoda en bpo-26404.)
El atributo wfile
de las clases StreamRequestHandler
ahora implementa la interfaz de escritura io.BufferedIOBase
. En particular, ahora se garantiza que llamar a write()
enviará los datos completos. (Contribuido por Martin Panter en bpo-26721.)
ssl¶
ssl
es compatible con OpenSSL 1.1.0. La versión mínima recomendada es 1.0.2. (Contribuido por Christian Heimes en bpo-26470.)
Se ha eliminado 3DES de los conjuntos de cifrado predeterminados y se han agregado conjuntos de cifrado ChaCha20 Poly1305. (Contribuido por Christian Heimes en bpo-27850 y bpo-27766.)
SSLContext
tiene una mejor configuración predeterminada para opciones y cifrados. (Contribuido por Christian Heimes en bpo-28043.)
La sesión SSL se puede copiar de una conexión del lado del cliente a otra con la nueva clase SSLSession
. La reanudación de la sesión de TLS puede acelerar el apretón de manos inicial, reducir la latencia y mejorar el rendimiento (Contribuido por Christian Heimes en bpo-19500 basado en un borrador de Alex Warhawk).
El nuevo método get_ciphers()
se puede utilizar para obtener una lista de cifrados habilitados en orden de prioridad de cifrado.
Todas las constantes y banderas se han convertido a IntEnum
y IntFlags
. (Contribuido por Christian Heimes en bpo-28025.)
Se agregaron protocolos TLS específicos del lado del servidor y del cliente para SSLContext
. (Contribuido por Christian Heimes en bpo-28085.)
Estadísticas¶
Se ha agregado una nueva función harmonic_mean()
. (Contribuido por Steven D’Aprano en bpo-27181.)
estructura¶
struct
ahora admite flotadores de media precisión IEEE 754 a través del especificador de formato 'e'
. (Contribuido por Eli Stevens, Mark Dickinson en bpo-11734.)
subproceso¶
El destructor subprocess.Popen
ahora emite una advertencia ResourceWarning
si el proceso hijo todavía se está ejecutando. Utilice el protocolo del administrador de contexto (with proc: ...
) o llame explícitamente al método wait()
para leer el estado de salida del proceso hijo. (Contribuido por Victor Stinner en bpo-26741.)
El constructor subprocess.Popen
y todas las funciones que le pasan argumentos ahora aceptan argumentos encoding y errors. Especificando alguno de ellos activará el modo texto para stdin, stdout y stderr. (Contribuido por Steve Dower en bpo-6135.)
sys¶
La nueva función getfilesystemencodeerrors()
devuelve el nombre del modo de error utilizado para convertir entre nombres de archivo Unicode y nombres de archivo en bytes. (Contribuido por Steve Dower en bpo-27781.)
En Windows, el valor de retorno de la función getwindowsversion()
ahora incluye el campo platform_version que contiene la versión principal precisa, la versión secundaria y el número de compilación del sistema operativo actual, en lugar de la versión que se está emulando para el proceso (contribución de Steve Dower en bpo-27932 .)
telnetlib¶
Telnet
es ahora un administrador de contexto (contribución de Stéphane Wirtel en bpo-25485).
tiempo¶
Los atributos struct_time
tm_gmtoff
y tm_zone
ahora están disponibles en todas las plataformas.
cronométralo¶
Se ha agregado el nuevo método de conveniencia Timer.autorange()
para llamar a Timer.timeit()
repetidamente para que el tiempo de ejecución total sea mayor o igual a 200 milisegundos. (Contribuido por Steven D’Aprano en bpo-6422.)
timeit
ahora advierte cuando hay una variación sustancial (4x) entre el mejor y el peor momento. (Contribuido por Serhiy Storchaka en bpo-23552.)
tkinter¶
Se agregaron los métodos trace_add()
, trace_remove()
y trace_info()
en la clase tkinter.Variable
. Reemplazan los métodos antiguos trace_variable()
, trace()
, trace_vdelete()
y trace_vinfo()
que usan comandos Tcl obsoletos y es posible que no funcionen en versiones futuras de Tcl. (Contribuido por Serhiy Storchaka en bpo-22115).
rastrear¶
Tanto el módulo de rastreo como la pantalla de excepción incorporada del intérprete ahora abrevian largas secuencias de líneas repetidas en los rastreos como se muestra en el siguiente ejemplo:
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(Contribuido por Emanuel Barry en bpo-26823.)
tracemalloc¶
El módulo tracemalloc
ahora admite el seguimiento de asignaciones de memoria en varios espacios de direcciones diferentes.
Se ha agregado la nueva clase de filtro DomainFilter
para filtrar los rastros de bloques por su espacio de direcciones (dominio).
(Contribuido por Victor Stinner en bpo-26588.)
mecanografía¶
Dado que el módulo typing
es provisional, todos los cambios introducidos en Python 3.6 también se han actualizado a Python 3.5.x.
El módulo typing
tiene un soporte mucho mejor para los alias de tipo genérico. Por ejemplo, Dict[str, Tuple[S, T]]
ahora es una anotación de tipo válida. (Contribuido por Guido van Rossum en Github #195.)
Se ha agregado la clase typing.ContextManager
para representar contextlib.AbstractContextManager
. (Contribuido por Brett Cannon en bpo-25609.)
Se ha agregado la clase typing.Collection
para representar collections.abc.Collection
. (Contribuido por Ivan Levkivskyi en bpo-27598.)
Se ha agregado la construcción de tipo typing.ClassVar
para marcar las variables de clase. Como se introdujo en PEP 526, una anotación de variable envuelta en ClassVar indica que un atributo dado está destinado a ser utilizado como una variable de clase y no debe establecerse en instancias de esa clase. (Contribuido por Ivan Levkivskyi en Github #280.)
Una nueva constante TYPE_CHECKING
que se supone que es True
por los verificadores de tipo estático, pero es False
en tiempo de ejecución. (Contribuido por Guido van Rossum en Github #230.)
Se ha agregado una nueva función auxiliar NewType()
para crear tipos distintos ligeros para anotaciones:
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
El verificador de tipo estático tratará el nuevo tipo como si fuera una subclase del tipo original. (Contribuido por Ivan Levkivskyi en Github #189.)
unicodedata¶
The unicodedata
module now uses data from Unicode 9.0.0.
(Contributed by Benjamin Peterson.)
unittest.mock¶
La clase Mock
tiene las siguientes mejoras:
Dos nuevos métodos,
Mock.assert_called()
yMock.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
yreplace
(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
ysurrogateescape
(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()
ybytearray.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'.')
ybytearray.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ónmalloc()
de la biblioteca C. El asignador de pymalloc está optimizado para objetos menores o iguales a 512 bytes con una vida útil corta y usamalloc()
para bloques de memoria más grandes. (Contribuido por Victor Stinner en bpo-26249).pickle.load()
ypickle.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()
yiglob()
optimizadas en el móduloglob
; ahora son unas 3 a 6 veces más rápidas. (Contribuido por Serhiy Storchaka en bpo-25596).Globbing optimizado en
pathlib
medianteos.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 deImportError
para aumentar. (Contribuido por Eric Snow en bpo-15767.)La nueva función
PyErr_ResourceWarning()
se puede utilizar para generar unResourceWarning
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()
yPyUnicode_FSDecoder()
ahora aceptarán path-like objects.
Otras mejoras¶
Cuando
--version
(forma corta:-V
) se suministra dos veces, Python imprimesys.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 parare.sub()
, todavía están permitidas, pero en desuso. La banderare.LOCALE
ahora solo se puede usar con patrones binarios.Se eliminó
inspect.getmoduleinfo()
(quedó en desuso desde CPython 3.3). Se debe utilizarinspect.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étodostraceback.usage
,traceback.modname
,traceback.fullmodname
,traceback.find_lines_from_code
,traceback.find_lines
,traceback.find_strings
,traceback.find_executable_lines
se eliminaron del módulotraceback
. 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()
ytk_bindForTraversal()
en las clases de widgetstkinter
(los comandos Tk correspondientes estaban obsoletos desde Tk 4.0).El método
open()
de la clasezipfile.ZipFile
ya no admite el modo'U'
(quedó obsoleto desde Python 3.4). Utiliceio.TextIOWrapper
para leer archivos de texto comprimidos en modo universal newlines.The undocumented
IN
,CDROM
,DLFCN
,TYPES
,CDIO
, andSTROPTS
modules have been removed. They had been available in the platform specificLib/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
oSHOW_TRACK_COUNT
definidas ahora está desactivada de forma predeterminada. Se puede volver a habilitar usando la opción-X showalloccount
. Ahora emite astderr
en lugar destdout
. (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 definirimportlib.abc.Loader.create_module()
.PyErr_SetImportError()
ahora estableceTypeError
cuando su argumento msg no está establecido. Anteriormente, solo se devolvíaNULL
.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 utilizanframe.f_lineno
,PyFrame_GetLineNumber()
oPyCode_Addr2Line()
no se ven afectadas. Las funciones que decodifican directamenteco_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. ConsulteObjects/lnotab_notes.txt
para conocer el formatoco_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 de1
o0
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 para1
o0
. Ver bpo-25768.La lectura del atributo
port
de los resultados deurllib.parse.urlsplit()
yurlparse()
ahora lanzaValueError
para valores fuera de rango, en lugar de devolverNone
. Ver bpo-20059.El módulo
imp
ahora lanza unDeprecationWarning
en lugar dePendingDeprecationWarning
.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
ywave
. Esto significa que exportarán nuevos símbolos cuando se utiliceimport *
. (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
, entoncesImportWarning
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 subirSystemError
. (Contribuido por Brett Cannon en bpo-18018.)Los servidores basados en el módulo
socketserver
, incluidos los definidos enhttp.server
,xmlrpc.server
ywsgiref.simple_server
, ahora solo detectan excepciones derivadas deException
. Por lo tanto, si un controlador de solicitudes lanza una excepción comoSystemExit
oKeyboardInterrupt
, ya no se llama ahandle_error()
y la excepción detendrá un servidor de un solo subproceso. (Contribuido por Martin Panter en bpo-23430.)spwd.getspnam()
ahora lanza unPermissionError
en lugar deKeyError
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
ysmtpd.SMTPServer
ahora esFalse
por defecto. Esto significa que el argumento pasado aprocess_message()
ahora es un objeto de bytes por defecto, yprocess_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()
yloads()
y los constructores de claseJSONEncoder
yJSONDecoder
en el módulojson
ahora son keyword-only. (Contribuido por Serhiy Storchaka en bpo-18726.)Es posible que las subclases de
type
que no anulantype.__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 enobject.__init_subclass__()
. Esto significa quetype.__new__()
ytype.__init__()
ahora aceptan argumentos de palabras clave arbitrarias, peroobject.__init_subclass__()
(que se llama desdetype.__new__()
) los rechazará de forma predeterminada. Las metaclases personalizadas que acepten argumentos de palabras clave adicionales deberán ajustar sus llamadas atype.__new__()
(ya sea directa o mediantesuper
) en consecuencia.En
distutils.command.sdist.sdist
, el atributodefault_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 archivosetup.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étodohttp.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 tipoOrderedDict
. (Contribuido por Steve Holden en bpo-27842.)El
crypt.METHOD_CRYPT
ya no se agregará acrypt.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 enLD_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()
ypkgutil.walk_packages()
ahora devuelven tuplas con nombreModuleInfo
. (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ó unRuntimeError
simple. Además, llamar a los métodosZipFile
en un ZipFile cerrado o llamar al métodowrite()
en un ZipFile creado con el modo'r'
lanzará unValueError
. Anteriormente, se planteó unRuntimeError
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 atype.__new__
para la inicialización. No hacerlo resultará en unDeprecationWarning
en Python 3.6 y unRuntimeError
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 elImportError
. 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 sistemamalloc()
. Las aplicaciones que llaman aPyMem_Malloc()
sin sostener el GIL ahora pueden fallar. Establezca la variable de entornoPYTHONMALLOC
endebug
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
yBUILD_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
yBUILD_MAP_UNPACK_WITH_CALL
, se han agregado los nuevos códigos de operaciónCALL_FUNCTION_EX
yBUILD_TUPLE_UNPACK_WITH_CALL
y se han eliminado los códigos de operaciónCALL_FUNCTION_VAR
,CALL_FUNCTION_VAR_KW
yMAKE_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
ySTORE_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.)