Lanzamiento del lenguaje de programación Python 3.10

Después de un año de desarrollo, se presenta una versión significativa del lenguaje de programación Python 3.10. Esta nueva rama será mantenida durante un año y medio, tras lo cual se realizarán correcciones para vulnerabilidades durante tres años y medio más.

Simultáneamente, comenzó la fase de pruebas alfa de la rama Python 3.11 (de acuerdo con el nuevo calendario de desarrollo, el trabajo en una nueva rama empieza cinco meses antes del lanzamiento de la rama anterior y, para el momento del siguiente lanzamiento, alcanza la etapa de pruebas alfa). La rama Python 3.11 estará en la fase de lanzamientos alfa durante siete meses, durante los cuales se añadirán nuevas funcionalidades y se corregirán errores. Después de esto, durante tres meses se realizarán pruebas de versiones beta, en las cuales se prohibirá la adición de nuevas funcionalidades y toda la atención se centrará en la corrección de errores. Los últimos dos meses antes del lanzamiento, la rama estará en la fase de candidatos a lanzamientos, donde se llevará a cabo la estabilización final.

Entre las novedades añadidas en Python 3.10:

  • Se implementaron los operadores «match» y «case» para el emparejamiento por patrones, que mejoran la legibilidad del código, simplifican el emparejamiento de objetos Python arbitrarios y aumentan la fiabilidad del código gracias a la posibilidad de una verificación de tipos estática más avanzada. La implementación es muy similar al operador «match» proporcionado en los lenguajes Scala, Rust y F#, que compara el resultado de la evaluación de la expresión indicada con una lista de patrones listados en bloques basados en el operador «case».

    def http_error(status): match status: case 400: return «Solicitud incorrecta» case 401|403|404: return «No permitido» case 418: return «Soy una tetera» case _: return «Algo más»

    Es posible descomprimir objetos, tuplas, listas y secuencias arbitrarias para enlazar variables según los valores disponibles. Se permite la definición de patrones anidados, el uso de condiciones adicionales "if" en el patrón, la aplicación de máscaras ("[x, y, *rest]"), el mapeo de pares clave/valor (por ejemplo, {"bandwidth": b, "latency": l} para extraer los valores "bandwidth" y "latency" de un diccionario), la extracción de subpatrones (operador ":=") y el uso de constantes nombradas en el patrón. En las clases, es posible configurar el comportamiento durante la coincidencia mediante el método "__match__()".

    from dataclasses import dataclass @dataclass class Point: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origen") case Point(0, y): print(f"Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("En otro lugar") case _: print("No es un punto") match point: case Point(x, y) if x == y: print(f"Y=X en {x}") case Point(x, y): print(f"No está en la diagonal") RED, GREEN, BLUE = 0, 1, 2 match color: case RED: print("¡Veo rojo!") case GREEN: print("La hierba es verde") case BLUE: print("Me siento triste :( ")

  • Se ha proporcionado la posibilidad de usar paréntesis en la instrucción with para distribuir en varias líneas la definición de la colección de gestores de contexto. También se permite dejar una coma después del gestor de contexto final en el grupo: with ( CtxManager1() as example1, CtxManager2() as example2, CtxManager3() as example3, ): …
  • Se ha mejorado la información sobre la ubicación en el código de errores relacionados con llaves y comillas no cerradas en literales de cadena. Por ejemplo, en lugar de informar sobre un error de sintaxis en la siguiente construcción al no cerrar una llave, ahora el indicador resalta la llave de apertura y avisa sobre la falta de un bloque de cierre. File "example.py", line 1 expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4, ^ SyntaxError: ‘{‘ nunca fue cerrado

    Se han añadido mensajes de error de sintaxis especializados adicionales: falta del símbolo «:» antes del bloque y en los diccionarios, no destacar la tupla entre paréntesis, falta de comas en las listas, especificación de un bloque «try» sin «except» y «finally», uso de «=» en lugar de «==» en comparaciones, y especificación de *-expresiones en f-strings. Además, se ha asegurado la identificación de toda la expresión problemática, no solo de su inicio, y se ha proporcionado una información más clara sobre el contexto de los errores relacionados con la indentación incorrecta. >>> def foo(): … if lel: … x = 2 Archivo «», línea 3 x = 2 ^ IndentationError: se esperaba un bloque indentado después de la instrucción ‘if’ en la línea 2

    En los errores causados por errores tipográficos en los nombres de atributos y nombres de variables en funciones, se proporciona una recomendación con el nombre correcto. >>> collections.namedtoplo Traza (llamada más reciente al último): Archivo «», línea 1, en AttributeError: el módulo 'collections' no tiene el atributo 'namedtoplo'. ¿Quisiste decir: namedtuple?

  • Para las herramientas de depuración y los perfiles se ha asegurado que en los eventos de trazas se indiquen los números exactos de las líneas de código ejecutadas.
  • Se ha agregado la configuración sys.flags.warn_default_encoding para alertar sobre posibles errores relacionados con la manipulación de archivos en TextIOWrapper y open() en codificación UTF-8 sin especificar explícitamente la opción ‘encoding=»utf-8″‘ (por defecto se utiliza la codificación ASCII). También se ha añadido en esta nueva versión la posibilidad de especificar el valor ‘encoding=»locale»‘ para establecer la codificación de acuerdo a la configuración regional actual.
  • En el módulo typing, que proporciona herramientas para asignar anotaciones de tipos, se ha añadido un nuevo operador que permite usar la sintaxis «X | Y» para seleccionar uno de los tipos (tipo X o tipo Y). def square(number: int | float) -> int | float: return number ** 2 es equivalente a la construcción soportada anteriormente: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • Se ha añadido al módulo typing el operador Concatenate y la variable ParamSpec, que permiten pasar información adicional para la verificación estática de tipos al usar Callable. También se han añadido valores especiales TypeGuard al módulo typing para anotar funciones de protección de tipos y TypeAlias para definir explícitamente un alias de tipo. StrCache: TypeAlias = ‘Cache[str]’ # un alias de tipo
  • La función zip() implementa una bandera opcional "strict", que verifica si los argumentos iterables tienen la misma longitud. >>> list(zip((‘a’, ‘b’, ‘c’), (1, 2, 3), strict=True)) [(‘a’, 1), (‘b’, 2), (‘c’, 3)] >>> list(zip(range(3), [‘fee’, ‘fi’, ‘fo’, ‘fum’], strict=True)) Traceback (most recent call last): … ValueError: zip() argument 2 is longer than argument 1
  • Se han propuesto nuevas funciones incorporadas aiter() y anext() que implementan análogos asíncronos de las funciones iter() y next().
  • Se ha acelerado el trabajo de los constructores str(), bytes() y bytearray() en un 30-40% al trabajar con objetos pequeños.
  • Se ha reducido el número de operaciones de importación en el módulo runpy. El comando «python3 -m nombre_del_módulo» ahora se ejecuta en promedio 1.4 veces más rápido gracias a la reducción de módulos importados de 69 a 51.
  • En la instrucción LOAD_ATTR se ha implementado un mecanismo de caché para ciertos opcodes, lo que ha permitido acelerar el trabajo con atributos comunes en un 36%, y con slots en un 44%.
  • Al compilar Python con la opción «—enable-optimizations», ahora se activa el modo «-fno-semantic-interposition», lo que permite, en comparación con la compilación con la opción «—enable-shared», acelerar el intérprete en un 30%.
  • En los módulos hashlib y ssl se agregó soporte para OpenSSL 3.0.0 y se eliminó el soporte para versiones de OpenSSL anteriores a 1.1.1.
  • Se eliminó el antiguo analizador, reemplazado en la rama anterior por el analizador PEG (Gramática de Expresión de Análisis). Se eliminó el módulo formatter. De la API de asyncio se eliminó el parámetro loop. Se eliminaron métodos previamente declarados obsoletos. Se eliminaron funciones Py_UNICODE_str*, que manipulaban cadenas Py_UNICODE*.
  • Se ha declarado obsoleto el módulo distutils, que está programado para ser eliminado en Python 3.12. Se recomienda utilizar los módulos setuptools, packaging, platform, shutil, subprocess y sysconfig en lugar de distutils. La estructura wstr en PyUnicodeObject ha sido catalogada entre las obsoletas y programadas para eliminación.

Fuente: opennet.ru

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster