Lanzamiento del lenguaje de programación Python 3.11

Después de un año de desarrollo, se publicó una versión importante del lenguaje de programación Python 3.11. La nueva rama recibirá soporte durante un año y medio, después de lo cual se formarán parches con vulnerabilidades durante otros tres años y medio.

Al mismo tiempo, comenzaron las pruebas alfa de la rama Python 3.12 (de acuerdo con el nuevo cronograma de desarrollo, el trabajo en una nueva rama comienza cinco meses antes del lanzamiento de la rama anterior y alcanza la etapa de prueba alfa en el momento del próximo lanzamiento). ). La rama Python 3.12 estará en versiones alfa durante siete meses, durante los cuales se agregarán nuevas funciones y se corregirán errores. Después de eso, las versiones beta se probarán durante tres meses, durante los cuales se prohibirá agregar nuevas funciones y se prestará toda la atención a corregir errores. Los dos últimos meses antes de la liberación, la sucursal estará en la etapa de candidato a liberación, donde se realizará la estabilización final.

Las nuevas incorporaciones en Python 3.11 incluyen:

  • Se ha realizado un trabajo importante para optimizar el rendimiento. La nueva rama incluye cambios relacionados con la aceleración y la implementación en línea de llamadas a funciones, el uso de intérpretes rápidos de operaciones típicas (x+x, x*x, xx, a[i], a[i] = z, f( arg) C( arg), o.method(), o.attr = z, *seq), así como optimizaciones preparadas por los proyectos Cinder y HotPy. Dependiendo del tipo de carga, se produce un aumento en la velocidad de ejecución del código entre un 10 y un 60%. En promedio, el rendimiento al pasar el conjunto de pruebas pyperformance aumentó en un 25%.

    Se rediseñó el mecanismo de almacenamiento en caché del código de bytes, lo que redujo el tiempo de inicio del intérprete entre un 10% y un 15%. Los objetos con código y código de bytes ahora son asignados estáticamente por el intérprete, lo que hizo posible eliminar las etapas de descomponer el código de bytes extraído del caché y convertir objetos con código para colocarlos en la memoria dinámica.

  • Al mostrar seguimientos de llamadas en mensajes de diagnóstico, se proporciona información sobre la expresión que causó el error (anteriormente, solo se resaltaba la línea sin detallar qué parte de la línea causó el error). La información de seguimiento extendida también se puede recuperar a través de la API y usarse para asignar instrucciones de código de bytes individuales a una posición específica en el código fuente usando el método codeobject.co_positions() o la función API C PyCode_Addr2Location(). El cambio simplifica enormemente los problemas de depuración asociados con objetos de diccionario anidados, múltiples llamadas a funciones y expresiones aritméticas complejas. Rastreo (última llamada más reciente): Archivo "calculation.py", línea 54, en resultado = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: división por cero
  • Se agregó soporte para grupos de excepciones, dándole al programa la capacidad de generar y procesar varias excepciones diferentes al mismo tiempo. Se proponen nuevos tipos de excepciones ExceptionGroup y BaseExceptionGroup para agrupar varias excepciones y su invocación conjunta, y se agrega la expresión "except*" para separar las excepciones de un grupo.
  • El método add_note() se agregó a la clase BaseException, que le permite adjuntar una nota de texto a la excepción, por ejemplo, para agregar información contextual que no estaba disponible en el momento en que se lanzó la excepción.
  • Se ha agregado un tipo especial Self para representar la clase privada actual. Self se puede utilizar para anotar métodos que devuelven una instancia de su clase de una manera más sencilla que usar TypeVar. clase MyLock: def __enter__(self) -> Self: self.lock() return self
  • Se ha agregado un tipo LiteralString especial que solo puede incluir cadenas literales que sean compatibles con el tipo LiteralString (es decir, cadenas simples y cadenas del tipo LiteralString, pero no cadenas arbitrarias o combinadas del tipo str). El tipo LiteralString se puede utilizar para limitar el paso de argumentos de cadena a funciones, cuya sustitución arbitraria de partes de cadenas puede generar vulnerabilidades, por ejemplo, al generar cadenas para consultas SQL o comandos de shell. def run_query(sql: LiteralString) -> ... ... def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Ninguno: run_query("SELECT * FROM Students") # ok run_query(literal_string) # ok run_query( "SELECT * FROM " + literal_string) # ok run_query(arbitrary_string) # Error run_query( # Error f"SELECT * FROM estudiantes DONDE nombre = {arbitrary_string}" )
  • Se ha agregado el tipo TypeVarTuple, que permite el uso de variables genéricas, a diferencia de TypeVar, que cubre no un tipo, sino un número arbitrario de tipos.
  • La biblioteca estándar incluye el módulo tomllib con funciones para analizar el formato TOML.
  • La capacidad de marcar elementos individuales de diccionarios escritos (TypedDict) con las marcas Required y NotRequired se proporciona para determinar los campos obligatorios y opcionales (de forma predeterminada, todos los campos declarados son obligatorios si el parámetro total no está configurado en False). clase Película (TypedDict): título: str año: NotRequired[int] m1: Película = {"título": "Black Panther", "año": 2018} # OK m2: Película = {"título": "Star Wars" } # OK (el campo de año es opcional) m3: Película = {"año": 2022} # Error, el campo de título requerido no se completó)
  • La clase TaskGroup se agregó al módulo asyncio con la implementación de un administrador de contexto asincrónico que espera a que se complete el grupo de tareas. Agregar tareas a un grupo se realiza mediante el método create_task(). async def main(): async con asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print("Ambas tareas se han completado ahora.")
  • Se agregó el decorador de clases, métodos y funciones @dataclass_transform; cuando se especifica, el verificador de tipos estáticos trata el objeto como si usara el decorador @dataclasses.dataclass. En el siguiente ejemplo, la clase CustomerModel se verificará como una clase con el decorador @dataclasses.dataclass, es decir como tener un método __init__ que permite variables de identificación y nombre. @dataclass_transform() clase ModelBase: … clase CustomerModel(ModelBase): id: int nombre: str
  • Se agregó la capacidad de usar agrupaciones atómicas ((?>…)) y cuantificadores celosos (posesivos) (*+, ++, ?+, {m,n}+) en expresiones regulares.
  • Se agregó la opción de línea de comando "-P" y la variable de entorno PYTHONSAFEPATH para deshabilitar el adjunto automático de rutas de archivos potencialmente inseguras a sys.path.
  • Se mejoró significativamente la utilidad py.exe para la plataforma Windows, que ahora admite la sintaxis "-V:". / " además de "- . ".
  • Muchas macros de la API de C se han convertido en funciones en línea normales o estáticas.
  • Los módulos uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev y sunau han quedado obsoletos y se eliminarán en Python Versión 3.13. Se eliminaron las funciones PyUnicode_Encode*.

Fuente: opennet.ru

Añadir un comentario