Lanzamento da linguaxe de programación Python 3.10

Despois dun ano de desenvolvemento, preséntase a importante versión da linguaxe de programación Python 3.10. A nova rama estará soportada durante un ano e medio, despois de que durante outros tres anos e medio xeraranse correccións para que elimine vulnerabilidades.

Ao mesmo tempo, comezaron as probas alfa da rama Python 3.11 (de acordo co novo calendario de desenvolvemento, o traballo nunha nova rama comeza cinco meses antes do lanzamento da rama anterior e chega á fase de probas alfa no momento da seguinte versión). ). A rama de Python 3.11 estará en versión alfa durante sete meses, durante os cales engadiranse novas funcións e corrixiranse erros. Despois disto, probaranse as versións beta durante tres meses, durante os cales prohibirase engadir novas funcións e prestarase toda a atención á resolución de erros. Durante os dous últimos meses anteriores á liberación, a sucursal estará na fase de candidato a liberación, na que se realizará a estabilización final.

As novas incorporacións a Python 3.10 inclúen:

  • Implementáronse operadores "coincidir" e "maiúsculas" para a correspondencia de patróns, que melloran a lexibilidade do código, simplifican a coincidencia de obxectos Python arbitrarios e aumentan a fiabilidade do código mediante a comprobación avanzada de tipos estáticos. A implementación é moi parecida ao operador "coincidir" proporcionado en Scala, Rust e F#, que compara o resultado dunha expresión especificada cunha lista de patróns listados en bloques baseados no operador "case".

    def http_error(estado): estado de coincidencia: caso 400: devolver “Solicitude incorrecta” caso 401|403|404: devolver “Non permitido” caso 418: devolver “Son unha tetera” case _: devolver “Algo máis”

    Pode desempaquetar obxectos, tuplas, listas e secuencias arbitrarias para vincular variables en función dos valores existentes. Permítese definir modelos anidados, usar condicións adicionais "se" no modelo, usar máscaras ("[x, y, *rest]"), asignacións de clave/valor (por exemplo, {"bandwidth": b, "latency") ”: l} para extraer valores de "ancho de banda" e "latencia" dun dicionario), extraer submodelos ("operador:="), usar constantes nomeadas nun modelo. Nas clases, é posible personalizar o comportamento de coincidencia usando o método "__match__()".

    desde clases de datos importar clase de datos @clase de datos Punto: x: int y: int def whereis(punto): punto de coincidencia: caso Punto(0, 0): print("Orixe") case Punto(0, y): imprimir(f" Y={y}") case Point(x, 0): print(f"X={x}") case Point(): print("En outro lugar") case _: print("Non é un punto") coinciden punto: caso Punto(x, y) se x == y: imprimir(f"Y=X en {x}") case Punto(x, y): imprimir(f"Non na diagonal") VERMELLO, VERDE, AZUL = 0, 1, 2 coincide coa cor: case VERMELLO: print("Veo vermello!") case VERDE: print("A herba é verde") case AZUL: print("Estou sentindo o azul :(“)

  • Agora é posible usar parénteses na instrución with para dividir a definición dunha colección de xestores de contexto en varias liñas. Tamén se permite deixar unha coma despois do xestor de contexto final do grupo: con ( CtxManager1() como exemplo1, CtxManager2() como exemplo2, CtxManager3() como exemplo3, ): ...
  • Informes mellorados da localización do código de erros relacionados con chaves e comiñas sen pechar nos literais de cadea. Por exemplo, cando hai unha chave sen pechar, en lugar de informar dun erro de sintaxe na seguinte construción, o punteiro agora resalta a chave de apertura e indica que non hai un bloque de peche. Ficheiro "example.py", liña 1 esperada = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nunca foi pechado

    Engadíronse mensaxes de erro de sintaxe especializadas adicionais: falta o símbolo ":" antes dun bloque e nos dicionarios, non separa unha tupla con parénteses, falta unha coma nas listas, especifica un bloque "try" sen "excepto" e "finally", usando "= " en lugar de "= =" nas comparacións, especificando expresións * en cadeas f. Ademais, garante que se resalte toda a expresión problemática, non só o principio, e información máis explícita sobre o contexto dos erros asociados a sangría incorrecta. >>> def foo(): ... if lel: ... x = 2 Ficheiro " ", liña 3 x = 2 ^ IndentationError: esperaba un bloque sangrado despois da instrución 'if' na liña 2

    Nos erros causados ​​por erros tipográficos nos nomes dos atributos e dos nomes das variables dunha función, sábese unha recomendación co nome correcto. >>>collections.namedtoplo Traceback (última chamada máis recente): Ficheiro « ", liña 1, en AttributeError: o módulo 'colecciones' non ten ningún atributo 'namedtoplo'. Querías dicir: namedtuple?

  • Para as ferramentas de depuración e os perfiladores, os eventos de rastrexo proporciónanse cos números de liña exactos do código executado.
  • Engadiuse a configuración sys.flags.warn_default_encoding para mostrar unha advertencia sobre posibles erros asociados con TextIOWrapper e open() ao procesar ficheiros codificados en UTF-8 sen especificar explícitamente a opción 'encoding=»utf-8″' (utilízase a codificación ASCII por defecto). A nova versión tamén ofrece a posibilidade de especificar un valor 'encoding="locale"' para establecer a codificación en función da configuración rexional actual.
  • Engadiuse un novo operador ao módulo de dixitación, que proporciona ferramentas para especificar anotacións de tipo, permitindo o uso da sintaxe “X | Y" para seleccionar un dos tipos (tipo X ou tipo Y). def cadrado(número: int | float) -> int | float: número de retorno ** 2 é equivalente á construción soportada anteriormente: def square(número: Unión[int, float]) -> Unión[int, float]: número de retorno ** 2
  • Engadíronse ao módulo de escritura o operador Concatenar e a variable ParamSpec, que lle permiten pasar información adicional para a comprobación do tipo estático cando se usa Callable. O módulo de escritura tamén engade valores especiais TypeGuard para anotar funcións de protección de tipo e TypeAlias ​​para definir explícitamente un alias de tipo. StrCache: TypeAlias ​​​​= 'Caché[str]' # un alias de tipo
  • A función zip() implementa unha marca opcional "estricta", que, cando se especifica, verifica se os argumentos que se iteran teñen a mesma lonxitude. >>> lista(zip(('a', 'b', 'c'), (1, 2, 3), estrito=Verdadero)) [('a', 1), ('b', 2) , ('c', 3)] >>> list(zip(range(3), ['tarifa', 'fi', 'fo', 'fum'], strict=True)) Traceback (última chamada máis recente ): … ValueError: o argumento 2 zip() é máis longo que o argumento 1
  • Propóñense novas funcións incorporadas aiter() e anext() coa implementación de análogos asíncronos ás funcións iter() e next().
  • O traballo dos construtores str(), bytes() e bytearray() ao traballar con obxectos pequenos acelerouse nun 30-40%.
  • Reduciuse o número de operacións de importación no módulo runpy. O comando "python3 -m module_name" agora execútase de media 1.4 veces máis rápido debido á redución dos módulos importados de 69 a 51.
  • A instrución LOAD_ATTR usa un mecanismo de almacenamento en caché para códigos de operación individuais, o que permitiu acelerar o traballo con atributos habituais ata un 36 % e con slots ata un 44 %.
  • Cando se crea Python coa opción "--enable-optimizations", agora está habilitado o modo "-fno-semantic-interposition", que permite acelerar o intérprete ata un 30% en comparación coa construción co "--enable-shared". ” opción.
  • Os módulos hashlib e ssl engadiron compatibilidade con OpenSSL 3.0.0 e deixaron de admitir versións de OpenSSL anteriores á 1.1.1.
  • Eliminouse o analizador antigo, que foi substituído na rama anterior polo analizador PEG (Parsing Expression Grammar). Eliminouse o módulo do formateador. Eliminouse o parámetro de bucle da API asyncio. Elimináronse os métodos que estaban en desuso anteriormente. Elimináronse as funcións Py_UNICODE_str* que manipulan as cadeas Py_UNICODE*.
  • O módulo distutils quedou en desuso e está programado para a súa eliminación en Python 3.12. En lugar de distutils, recoméndase usar os módulos setuptools, packaging, platform, shutil, subprocess e sysconfig. A estrutura wstr en PyUnicodeObject quedou en desuso e planificouse para a súa eliminación.

Fonte: opennet.ru

Engadir un comentario