Lanzamiento del lenguaje de programación Python 3.10

Después de un año de desarrollo, se presenta el importante lanzamiento del lenguaje de programación Python 3.10. La nueva rama recibirá soporte durante un año y medio, después del cual, durante otros tres años y medio, se generarán correcciones para eliminar vulnerabilidades.

Al mismo tiempo, comenzaron las pruebas alfa de la rama Python 3.11 (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.11 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.10 incluyen:

  • Se implementaron operadores "match" y "case" para la coincidencia de patrones, que mejoran la legibilidad del código, simplifican la coincidencia de objetos Python arbitrarios y aumentan la confiabilidad del código mediante la verificación avanzada de tipos estáticos. La implementación es muy parecida al operador "coincidencia" proporcionado en Scala, Rust y F#, que compara el resultado de una expresión especificada con una lista de patrones enumerados en bloques basados ​​en el operador "caso".

    def http_error(estado): estado de la coincidencia: caso 400: devuelve “Solicitud incorrecta” caso 401|403|404: devuelve “No permitido” caso 418: devuelve “Soy una tetera” caso _: devuelve “Algo más”

    Es posible descomprimir objetos, tuplas, listas y secuencias arbitrarias para vincular variables basadas en valores existentes. Se permite definir plantillas anidadas, usar condiciones “if” adicionales en la plantilla, usar máscaras (“[x, y, *rest]”), asignaciones de clave/valor (por ejemplo, {“bandwidth”: b, “latency ”: l} para extraer valores de "ancho de banda" y "latencia" de un diccionario), extraer subplantillas (":=" operador), usar constantes con nombre en una plantilla. En las clases, es posible personalizar el comportamiento de coincidencia utilizando el método “__match__()”.

    desde clases de datos importar clase de datos @clase de datos clase Punto: x: int y: int def dónde está (punto): punto de coincidencia: caso Punto (0, 0): imprimir ("Origen") caso Punto (0, y): imprimir (f" Y={y}") case Punto(x, 0): print(f"X={x}") case Punto(): print("En algún otro lugar") case _: print("No es un punto") coincidencia punto: caso Punto(x, y) if x == y: print(f"Y=X en {x}") caso Punto(x, y): print(f"No en la diagonal") ROJO, VERDE, AZUL = 0, 1, 2 coincidir con color: caso ROJO: imprimir(“¡Veo rojo!”) caso VERDE: imprimir(“La hierba es verde”) caso AZUL: imprimir(“Estoy sintiendo la tristeza :(“)

  • Ahora es posible utilizar paréntesis en la instrucción with para dividir la definición de una colección de administradores de contexto en varias líneas. También se permite dejar una coma después del administrador de contexto final en el grupo: con ( CtxManager1() como ejemplo1, CtxManager2() como ejemplo2, CtxManager3() como ejemplo3, ): ...
  • Se mejoraron los informes de la ubicación del código de errores relacionados con llaves y comillas abiertas en literales de cadena. Por ejemplo, cuando hay una llave sin cerrar, en lugar de informar un error de sintaxis en la siguiente construcción, el puntero ahora resalta la llave de apertura e indica que no hay ningún bloque de cierre. Archivo "ejemplo.py", línea 1 esperada = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nunca estuvo cerrado

    Se agregaron mensajes de error de sintaxis especializados adicionales: falta el símbolo ":" antes de un bloque y en los diccionarios, no separar una tupla con paréntesis, falta una coma en las listas, especificar un bloque "probar" sin "excepto" y "finalmente", usar "= " en lugar de "= =" en comparaciones, especificando expresiones * en cadenas f. Además, garantiza que se resalte toda la expresión problemática, no sólo el principio, y más información explícita sobre el contexto de los errores asociados con una sangría incorrecta. >>> def foo(): ... si lel: ... x = 2 Archivo " ", línea 3 x = 2 ^ IndentationError: se esperaba un bloque con sangría después de la declaración 'if' en la línea 2

    En caso de errores causados ​​por errores tipográficos en los nombres de atributos y nombres de variables en una función, se genera una recomendación con el nombre correcto. >>>collections.namedtoplo Traceback (última llamada más reciente): Archivo « ", línea 1, en AttributeError: el módulo 'colecciones' no tiene el atributo 'namedtoplo'. Quiso decir: nametuple?

  • Para herramientas de depuración y generadores de perfiles, los eventos de seguimiento se proporcionan con los números de línea exactos del código ejecutado.
  • Se agregó la configuración sys.flags.warn_default_encoding para mostrar una advertencia sobre posibles errores asociados con TextIOWrapper y open() al procesar archivos codificados en UTF-8 sin especificar explícitamente la opción 'encoding=»utf-8″' (la codificación ASCII se usa de forma predeterminada) . La nueva versión también ofrece la posibilidad de especificar un valor 'encoding="locale"' para establecer la codificación según la configuración regional actual.
  • Se agregó un nuevo operador al módulo de escritura, que proporciona herramientas para especificar anotaciones de tipo, permitiendo el uso de la sintaxis “X | Y" para seleccionar uno de los tipos (tipo X o tipo Y). def cuadrado(número: int | float) -> int | float: número de retorno ** 2 es equivalente a la construcción admitida anteriormente: def cuadrado(número: Unión[int, float]) -> Unión[int, float]: número de retorno ** 2
  • El operador Concatenate y la variable ParamSpec se agregaron al módulo de escritura, lo que le permite pasar información adicional para la verificación de tipos estáticos cuando usa Callable. El módulo de escritura también agrega valores especiales TypeGuard para anotar funciones de protección de tipo y TypeAlias ​​para definir explícitamente un alias de tipo. StrCache: TypeAlias ​​= 'Cache[str]' # un alias de tipo
  • La función zip() implementa un indicador "estricto" opcional que, cuando se especifica, verifica si los argumentos que se iteran tienen la misma longitud. >>> lista(zip(('a', 'b', 'c'), (1, 2, 3), estricto=Verdadero)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['fee', 'fi', 'fo', 'fum'], estricto=True)) Rastreo (última llamada más reciente ): … ValueError: el argumento 2 de zip() es más largo que el argumento 1
  • Se proponen nuevas funciones integradas aiter() y anext() con la implementación de análogos asincrónicos a las funciones iter() y next().
  • El trabajo de los constructores str(), bytes() y bytearray() cuando se trabaja con objetos pequeños se ha acelerado en un 30-40%.
  • Se redujo la cantidad de operaciones de importación en el módulo runpy. El comando "python3 -m module_name" ahora se ejecuta en promedio 1.4 veces más rápido debido a la reducción de módulos importados de 69 a 51.
  • La instrucción LOAD_ATTR utiliza un mecanismo de almacenamiento en caché para códigos de operación individuales, lo que hizo posible acelerar el trabajo con atributos regulares hasta en un 36% y con ranuras hasta en un 44%.
  • Al compilar Python con la opción “--enable-optimizations”, el modo “-fno-semantic-interposition” ahora está habilitado, lo que permite acelerar el intérprete hasta en un 30% en comparación con la compilación con “--enable-shared " opción.
  • Los módulos hashlib y ssl agregaron soporte para OpenSSL 3.0.0 y dejaron de admitir versiones de OpenSSL anteriores a 1.1.1.
  • Se eliminó el antiguo analizador, que fue reemplazado en la rama anterior por el analizador PEG (Parsing Expression Grammar). El módulo formateador ha sido eliminado. El parámetro de bucle se eliminó de la API asyncio. Se eliminaron los métodos que anteriormente estaban obsoletos. Se han eliminado las funciones Py_UNICODE_str* que manipulan cadenas Py_UNICODE*.
  • El módulo distutils ha quedado obsoleto y su eliminación está programada para Python 3.12. En lugar de distutils, se recomienda utilizar los módulos setuptools, packaging, platform,shutil, subprocess y sysconfig. La estructura wstr en PyUnicodeObject ha quedado obsoleta y está programada su eliminación.

Fuente: opennet.ru

Añadir un comentario