Lançamento da linguagem de programação Python 3.10

Após um ano de desenvolvimento, é apresentado o significativo lançamento da linguagem de programação Python 3.10. A nova filial terá suporte por um ano e meio, após o qual por mais três anos e meio serão geradas correções para eliminar vulnerabilidades.

Ao mesmo tempo, o teste alfa do branch Python 3.11 começou (de acordo com o novo cronograma de desenvolvimento, o trabalho em um novo branch começa cinco meses antes do lançamento do branch anterior e atinge o estágio de teste alfa no momento do próximo lançamento ). O branch Python 3.11 estará em versão alfa por sete meses, durante os quais novos recursos serão adicionados e bugs corrigidos. Depois disso, as versões beta serão testadas por três meses, durante os quais será proibida a adição de novos recursos e toda atenção será dada à correção de bugs. Nos últimos dois meses antes do lançamento, a filial estará na fase de release candidate, na qual será realizada a estabilização final.

Novas adições ao Python 3.10 incluem:

  • Operadores "match" e "case" implementados para correspondência de padrões, que melhoram a legibilidade do código, simplificam a correspondência de objetos Python arbitrários e aumentam a confiabilidade do código por meio de verificação avançada de tipo estático. A implementação é muito parecida com o operador "match" fornecido em Scala, Rust e F#, que compara o resultado de uma expressão especificada com uma lista de padrões listados em blocos baseados no operador "case".

    def http_error(status): status da correspondência: case 400: retorne “Solicitação incorreta” case 401|403|404: retorne “Não permitido” case 418: retorne “Sou um bule” case _: retorne “Outra coisa”

    Você pode descompactar objetos, tuplas, listas e sequências arbitrárias para vincular variáveis ​​com base em valores existentes. É permitido definir modelos aninhados, usar condições “if” adicionais no modelo, usar máscaras (“[x, y, *rest]”), mapeamentos de chave/valor (por exemplo, {“largura de banda”: ​​b, “latência ”: l} para extrair valores de "largura de banda" e "latência" de um dicionário), extrair submodelos (operador ":="), usar constantes nomeadas em um modelo. Nas aulas, é possível personalizar o comportamento de correspondência usando o método “__match__()”.

    from dataclasses import dataclass @dataclass class Ponto: x: int y: int def whereis(point): match point: case Point(0, 0): print("Origin") case Point(0, y): print(f" Y={y}") case Ponto(x, 0): print(f"X={x}") case Ponto(): print("Em outro lugar") case _: print("Não é um ponto") match ponto: case Ponto(x, y) se x == y: print(f"Y=X em {x}") case Ponto(x, y): print(f"Não está na diagonal") VERMELHO, VERDE, AZUL = 0, 1, 2 cor correspondente: case VERMELHO: print(“Vejo vermelho!”) case VERDE: print(“A grama é verde”) case AZUL: print(“Estou me sentindo triste :(“)

  • Agora é possível usar parênteses na instrução with para dividir a definição de uma coleção de gerenciadores de contexto em múltiplas linhas. Também é permitido deixar uma vírgula após o gerenciador de contexto final do grupo: with ( CtxManager1() como exemplo1, CtxManager2() como exemplo2, CtxManager3() como exemplo3, ): ...
  • Relatórios aprimorados da localização do código de erros relacionados a colchetes e aspas não fechadas em literais de string. Por exemplo, quando há uma chave não fechada, em vez de reportar um erro de sintaxe na construção seguinte, o ponteiro agora destaca a chave de abertura e indica que não há bloco de fechamento. Arquivo "example.py", linha 1 esperada = {9:1, 18:2, 19:2, 27:3, 28:3, 29:3, 36:4, 37:4, ^SyntaxError: '{' nunca foi fechado

    Adicionadas mensagens de erro de sintaxe especializadas adicionais: falta do símbolo ":" antes de um bloco e em dicionários, não separar uma tupla com parênteses, falta de uma vírgula nas listas, especificar um bloco "try" sem "exceto" e "finalmente", usando "= " em vez de "= =" em comparações, especificando expressões * em strings f. Além disso, garante que toda a expressão problemática seja destacada, não apenas o início, e informações mais explícitas sobre o contexto de erros associados à indentação incorreta. >>> def foo(): ... if lel: ... x = 2 Arquivo " ", linha 3 x = 2 ^ IndentationError: esperava um bloco recuado após a instrução 'if' na linha 2

    Em erros causados ​​por erros de digitação nos nomes de atributos e nomes de variáveis ​​em uma função, é emitida uma recomendação com o nome correto. >>>collections.namedtoplo Traceback (última chamada mais recente): Arquivo « ", linha 1, em AttributeError: o módulo 'coleções' não possui o atributo 'namedtoplo'. Você quis dizer: Nametuple?

  • Para ferramentas de depuração e criadores de perfil, os eventos de rastreamento são fornecidos com os números exatos de linha do código executado.
  • Adicionada a configuração sys.flags.warn_default_encoding para exibir um aviso sobre possíveis erros associados ao TextIOWrapper e open() processando arquivos codificados em UTF-8 sem especificar explicitamente a opção 'encoding=»utf-8″' (a codificação ASCII é usada por padrão) . A nova versão também oferece a capacidade de especificar um valor 'encoding="locale"' para definir a codificação com base na localidade atual.
  • Um novo operador foi adicionado ao módulo de digitação, que fornece ferramentas para especificação de anotações de tipo, permitindo o uso da sintaxe “X | Y" para selecionar um dos tipos (tipo X ou tipo Y). def quadrado(número: int | float) -> int | float: return number ** 2 é equivalente à construção suportada anteriormente: def square(number: Union[int, float]) -> Union[int, float]: return number ** 2
  • O operador Concatenate e a variável ParamSpec foram adicionados ao módulo de digitação, o que permite passar informações adicionais para verificação de tipo estático ao usar Callable. O módulo de digitação também adiciona valores especiais TypeGuard para anotar funções de proteção de tipo e TypeAlias ​​​​para definir explicitamente um alias de tipo. StrCache: TypeAlias ​​​​= 'Cache[str]' # um alias de tipo
  • A função zip() implementa um sinalizador “estrito” opcional, que, quando especificado, verifica se os argumentos que estão sendo iterados têm o mesmo comprimento. >>> lista(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 (última chamada mais recente ):… ValueError: zip() o argumento 2 é maior que o argumento 1
  • Novas funções integradas aiter() e anext() são propostas com a implementação de análogos assíncronos às funções iter() e next().
  • O trabalho dos construtores str(), bytes() e bytearray() ao trabalhar com objetos pequenos foi acelerado em 30-40%.
  • Reduziu o número de operações de importação no módulo runpy. O comando "python3 -m module_name" agora roda em média 1.4 vezes mais rápido devido à redução de módulos importados de 69 para 51.
  • A instrução LOAD_ATTR utiliza um mecanismo de cache para opcodes individuais, o que possibilitou agilizar o trabalho com atributos regulares em até 36% e com slots em até 44%.
  • Ao construir Python com a opção “--enable-optimizations”, o modo “-fno-semantic-interposition” agora está habilitado, o que permite acelerar o interpretador em até 30% em comparação com a construção com a opção “--enable-shared ”Opção.
  • Os módulos hashlib e ssl adicionaram suporte para OpenSSL 3.0.0 e pararam de oferecer suporte a versões OpenSSL anteriores a 1.1.1.
  • O analisador antigo foi removido, que foi substituído no ramo anterior pelo analisador PEG (Parsing Expression Grammar). O módulo do formatador foi removido. O parâmetro loop foi removido da API asyncio. Os métodos que estavam obsoletos anteriormente foram removidos. As funções Py_UNICODE_str* que manipulam strings Py_UNICODE* foram removidas.
  • O módulo distutils foi descontinuado e está programado para remoção no Python 3.12. Em vez de distutils, é recomendado usar os módulos setuptools, empacotamento, plataforma, shutil, subprocess e sysconfig. A estrutura wstr em PyUnicodeObject foi descontinuada e agendada para remoção.

Fonte: opennet.ru

Adicionar um comentário