Después de un año de desarrollo importante lanzamiento del lenguaje de programación . Python 3.9 fue el primer lanzamiento después de el proyecto en de preparación y mantenimiento de lanzamientos. Ahora, los lanzamientos significativos se formarán una vez al año, y las actualizaciones correctivas se lanzarán cada dos meses. Cada rama significativa será compatible durante un año y medio, después de lo cual se generarán correcciones para ella durante tres años y medio más, enfocándose en la eliminación de vulnerabilidades.
El trabajo en la nueva rama ahora comienza cinco meses antes del lanzamiento de la próxima rama, es decir, simultáneamente con el lanzamiento de Python 3.9 la prueba alfa de la rama Python 3.10. La rama Python 3.10 estará en fase de lanzamientos alfa durante siete meses, durante los cuales se agregarán nuevas características y se corregirán errores. Después de esto, se llevará a cabo una prueba beta durante tres meses, durante la cual no se permitirán nuevas características y toda la atención se centrará en la corrección de errores. Los últimos dos meses antes del lanzamiento, la rama estará en fase de candidato a lanzamientos, donde se realizará la estabilización final.
en Python 3.9:
- En los diccionarios definidos mediante la clase incorporada dict, se soportan los operadores de fusión «|» y actualización «|=», que complementan los métodos {**d1, **d2} y dict.update, que antes se proponían para combinar diccionarios.
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}>>> x | y
{‘key1’: ‘value1 from x’, ‘key2’: ‘value2 from y’, ‘key3’: ‘value3 from y’}>>> y | x
{‘key2’: ‘value2 from x’, ‘key3’: ‘value3 from y’, ‘key1’: ‘value1 from x’} - La colección de tipos incorporada incluye list, dict y tuple, que se pueden usar como tipos básicos sin importar desde el módulo typing. Es decir, en lugar de typing.List, typing.Dict y typing.Tuple, ahora se pueden especificar
simplemente list, dict y tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - herramientas flexibles para anotar funciones y variables. Para adjuntar anotaciones, se ha agregado un nuevo tipo Annotated al módulo typing, que amplía los tipos existentes con metadatos adicionales que pueden utilizarse para análisis estático o para optimizaciones en tiempo de ejecución. Para acceder a los metadatos desde el código, se ha añadido un parámetro include_extras al método typing.get_type_hints().
charType = Annotated[int, ctype("char")]
UnsignedShort = Annotated[int, struct2.ctype('H')] - Los requisitos gramaticales para los decoradores: cualquier expresión adecuada para su uso en bloques if y while ahora puede usarse como decorador. Este cambio ha mejorado notablemente la legibilidad del código de PyQt5 y ha simplificado el mantenimiento de este módulo:
Antes:
button_0 = buttons[0]
@button_0.clicked.connectAhora se puede escribir:
@buttons[0].clicked.connect - En la biblioteca estándar módulo , que incluye información de la base de datos de zonas horarias de IANA.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Hora de verano
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo('America/Los_Angeles'))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
'PDT'>>> # Hora estándar
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Se ha añadido el módulo graphlib, que soporta la ordenación topológica de grafos.
- nuevos métodos para eliminar prefijos y sufijos de cadenas: str.removeprefix(prefix) y str.removesuffix(suffix). Los métodos se han añadido a los objetos str, bytes, bytearray y collections.UserString.
>>> s = 'FooBar'
>>> s.removeprefix('Foo')
'Bar' - nuevo analizador (Gramática de Expresión de Análisis), que ha sustituido al analizador . La aplicación del nuevo analizador ha permitido eliminar algunos 'hackeos' utilizados para sortear las limitaciones en LL(1), y ha reducido considerablemente el esfuerzo de mantenimiento del analizador. En cuanto a rendimiento, el nuevo analizador se encuentra aproximadamente al mismo nivel que el anterior, pero lo supera notablemente en flexibilidad, lo que permite tener más libertad al diseñar nuevas características del lenguaje. El código del antiguo analizador se ha mantenido y puede recuperarse mediante la bandera '-X oldparser' o la variable de entorno 'PYTHONOLDPARSER=1', pero se eliminará en la versión 3.10.
- la capacidad de acceso de los métodos de las extensiones en C al estado de los módulos en los que están definidos, utilizando la desreferenciación directa de punteros en lugar de buscar el estado del módulo mediante la función PyState_FindModule. Este cambio permite aumentar el rendimiento de los módulos en C al reducir o eliminar por completo los costos de verificación del estado del módulo. Para asociar un módulo con una clase, se ha propuesto la función en C PyType_FromModuleAndSpec(), para obtener el módulo y su estado, las funciones en C PyType_GetModule() y PyType_GetModuleState(), y para proporcionar acceso al método a la clase en la que está definido, la función en C PyCMethod y el flag METH_METHOD.
- Recolector de basura de la bloqueo de colecciones que incluyen objetos reanimados, que permanecen accesibles externamente después de iniciar el finalizador.
- Se añadió el método , que permite utilizar la subsistema del núcleo de Linux «pidfd» para manejar la situación de reutilización de PID (pidfd se vincula a un proceso específico y no cambia, mientras que el PID puede estar vinculado a otro proceso después de que el proceso actual asociado con este PID haya terminado).
- El soporte para la especificación Unicode se ha actualizado a la versión 13.0.0.
- Corregido al reinicializar el intérprete de Python en un solo proceso.
- Se ha optimizado el rendimiento de los tipos integrados range, tuple, set, frozenset, list y dict, mediante la aplicación del protocolo de llamada rápida Vectorcall para un acceso más rápido a los objetos escritos en C.
- Los módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time y _weakref se han trasladado a cargar con .
- Los módulos de la biblioteca estándar audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios y zlib han sido adaptados para utilizar un , que resuelve el problema de funcionalidad de las compilaciones de módulos de extensión para diferentes versiones de Python (al actualizar la versión no es necesario recompilar los módulos de extensión, y los módulos compilados para 3.9 podrán funcionar en la rama 3.10).
- En el módulo asyncio, debido a posibles problemas de seguridad, se ha descontinuado el soporte para el parámetro reuse_address (usar SO_REUSEADDR para UDP en Linux permite que diferentes procesos conecten sockets de escucha a un puerto UDP).
- Se han añadido nuevas optimizaciones, como un mejor rendimiento de los controladores de señales en aplicaciones multihilo, se ha incrementado la velocidad de operación del módulo subprocess en el entorno de FreeBSD y se ha acelerado la asignación de variables temporales (asignar una variable en la expresión «for y in [expr]» ahora no es menos eficiente que la expresión «y = expr»). En general, la mayoría de las pruebas mostraron una disminución del rendimiento en comparación con la rama 3.8 (la aceleración se observa solo en las pruebas write_local y write_deque):
Versión de Python 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Acceso a variables y atributos:
read_local 7.1 7.1 5.4 5.1 3.9 4.0
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
read_global 15.5 19.0 14.3 13.6 7.6 7.7
read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
leer_var_clase_de_clase 25.6 26.5 20.7 19.5 18.4 18.6
leer_var_clase_de_instancia 22.8 23.5 18.8 17.1 16.4 20.1
leer_var_instancia 32.4 33.1 28.0 26.3 25.4 27.7
leer_var_instancia_slots 27.8 31.3 20.8 20.8 20.2 24.5
leer_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
leer_metodo_vinculado 37.6 37.9 29.6 26.9 27.7 45.9Acceso a escritura de variable y atributo:
escribir_local 8.7 9.3 5.5 5.3 4.3 4.2
escribir_no_local 10.5 11.1 5.6 5.5 4.7 4.9
escribir_global 19.7 21.2 18.0 18.0 15.8 17.2
escribir_var_clase 92.9 96.0 104.6 102.1 39.2 43.2
escribir_var_instancia 44.6 45.8 40.0 38.9 35.5 40.7
escribir_var_instancia_slots 35.6 36.1 27.3 26.6 25.7 27.7Acceso a lectura de estructura de datos:
leer_lista 24.2 24.5 20.8 20.8 19.0 21.1
leer_deque 24.7 25.5 20.2 20.6 19.8 21.6
leer_diccionario 24.3 25.7 22.3 23.0 21.0 22.5
leer_strdiccionario 22.6 24.3 19.5 21.2 18.9 21.6Acceso a escritura de estructura de datos:
escribir_lista 27.1 28.5 22.5 21.6 20.0 21.6
escribir_deque 28.7 30.1 22.7 21.8 23.5 23.2
escribir_diccionario 31.4 33.3 29.3 29.2 24.7 27.8
escribir_strdiccionario 28.4 29.9 27.5 25.2 23.1 29.8Operaciones en pila (o cola):
apend_pop_lista 93.4 112.7 75.4 74.2 50.8 53.9
apend_pop_deque 43.5 57.0 49.4 49.2 42.5 45.5
apend_borrar_izquierda_deque 43.7 57.3 49.7 49.7 42.8 45.5Temporización del ciclo:
sobrecarga_del_ciclo 0.5 0.6 0.4 0.3 0.3 0.3 - muchas funciones y métodos de Python 2.7, que anteriormente habían sido marcados como obsoletos y en la última versión producían una advertencia de DeprecationWarning, incluyendo el método unescape() en html.parser.HTMLParser,
tostring() y fromstring() en array.array, isAlive() en threading.Thread, getchildren() y getiterator() en ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() y base64.decodestring().
Fuente: opennet.ru
