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

Após um ano de desenvolvimento, o lançamento significativo da linguagem de programação Python 3.11 foi publicado. 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.12 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.12 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.11 incluem:

  • Um trabalho significativo foi feito para otimizar o desempenho. A nova ramificação inclui mudanças relacionadas à aceleração e implantação inline de chamadas de função, ao uso de interpretadores rápidos de operações padrão (x+x, x*x, xx, a[i], a[i] = z, f(arg) C( arg), o.method(), o.attr = z, *seq), bem como otimizações preparadas pelos projetos Cinder e HotPy. Dependendo do tipo de carga, há um aumento na velocidade de execução do código de 10 a 60%. Em média, o desempenho no conjunto de testes pyperformance aumentou 25%.

    O mecanismo de cache de bytecode foi redesenhado, o que reduziu o tempo de inicialização do interpretador em 10-15%. Objetos com código e bytecode passaram a ser alocados estaticamente pelo interpretador, o que possibilitou eliminar as etapas de desempacotamento do bytecode extraído do cache e conversão de objetos com código para serem colocados na memória dinâmica.

  • Ao exibir rastreamentos de chamadas em mensagens de diagnóstico, agora é possível exibir informações sobre a expressão que causou o erro (antes, apenas a linha era destacada sem detalhar qual parte da linha causava o erro). Informações de rastreamento estendidas também podem ser obtidas por meio da API e usadas para mapear instruções de bytecode individuais para uma posição específica no código-fonte usando o método codeobject.co_positions() ou a função C API PyCode_Addr2Location(). A mudança torna muito mais fácil depurar problemas com objetos de dicionário aninhados, múltiplas chamadas de função e expressões aritméticas complexas. Traceback (última chamada mais recente): Arquivo "calculation.py", linha 54, em resultado = (x / y / z) * (a / b / c) ~~~~~~^~~ ZeroDivisionError: divisão por zero
  • Adicionado suporte para grupos de exceções, dando ao programa a capacidade de gerar e processar diversas exceções diferentes de uma só vez. Para agrupar múltiplas exceções e aumentá-las juntas, novos tipos de exceção ExceptionGroup e BaseExceptionGroup foram propostos, e a expressão “except*” foi adicionada para destacar exceções individuais de um grupo.
  • O método add_note() foi adicionado à classe BaseException, permitindo anexar uma nota de texto à exceção, por exemplo, adicionando informações contextuais que não estão disponíveis quando a exceção é lançada.
  • Adicionado um tipo Self especial para representar a classe privada atual. Self pode ser usado para anotar métodos que retornam uma instância de sua classe de uma forma mais simples do que usar TypeVar. classe MyLock: def __enter__(self) -> Self: self.lock() return self
  • Adicionado um tipo LiteralString especial que só pode incluir literais de string compatíveis com o tipo LiteralString (ou seja, strings simples e LiteralString, mas não strings str arbitrárias ou combinadas). O tipo LiteralString pode ser usado para limitar a passagem de argumentos de string para funções, substituição arbitrária de partes de strings que podem levar a vulnerabilidades, por exemplo, ao gerar strings para consultas SQL ou comandos shell. def run_query(sql: LiteralString) -> ... ... def caller( arbitrário_string: str, query_string: LiteralString, table_name: LiteralString, ) -> Nenhum: run_query("SELECT * FROM estudantes") # ok run_query(literal_string) # ok run_query( "SELECT * FROM" + literal_string) # ok run_query(arbitrary_string) # Erro run_query( # Erro f"SELECT * FROM estudantes WHERE nome = {arbitrary_string}" )
  • O tipo TypeVarTuple foi adicionado, permitindo o uso de variáveis ​​genéricas, ao contrário de TypeVar, que cobre não um tipo, mas um número arbitrário de tipos.
  • A biblioteca padrão inclui o módulo tomllib com funções para analisar o formato TOML.
  • É possível marcar elementos individuais de dicionários digitados (TypedDict) com rótulos Required e NotRequired para determinar campos obrigatórios e opcionais (por padrão, todos os campos declarados são obrigatórios se o parâmetro total não estiver definido como False). class Movie (TypedDict): título: str ano: NotRequired[int] m1: Movie = {"title": "Black Panther", "year": 2018} # OK m2: Movie = {"title": "Star Wars" } # OK (o campo ano é opcional) m3: Filme = {“ano”: 2022} # Erro, o campo obrigatório do título não está preenchido)
  • A classe TaskGroup foi adicionada ao módulo asyncio com a implementação de um gerenciador de contexto assíncrono que aguarda a conclusão de um grupo de tarefas. A adição de tarefas a um grupo é feita usando o método create_task(). async def main(): assíncrono com asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(...)) task2 = tg.create_task(another_coro(...)) print("Ambas as tarefas foram concluídas agora .")
  • Adicionado decorador @dataclass_transform para classes, métodos e funções, quando especificado, o sistema de verificação de tipo estático trata o objeto como se estivesse usando o decorador @dataclasses.dataclass. No exemplo abaixo, a classe CustomerModel, ao verificar os tipos, será processada de forma semelhante a uma classe com o decorador @dataclasses.dataclass, ou seja, como tendo um método __init__ que aceita variáveis ​​​​id e name. @dataclass_transform() classe ModelBase: ... class CustomerModel(ModelBase): id: int nome: str
  • Em expressões regulares, foi adicionada a capacidade de usar agrupamento atômico ((?>...)) e quantificadores possessivos (*+, ++, ?+, {m,n}+).
  • Adicionada a opção de linha de comando "-P" e a variável de ambiente PYTHONSAFEPATH para desativar a anexação automática de caminhos de arquivo potencialmente inseguros ao sys.path.
  • O utilitário py.exe para a plataforma Windows foi significativamente melhorado, adicionando suporte para a sintaxe “-V:”. / " além de "- . "
  • Muitas macros na API C são convertidas em funções embutidas regulares ou estáticas.
  • Os módulos uu, cgi, pipes, crypt, aifc, chunk, msilib, telnetlib, audioop, nis, sndhdr, imghdr, nntplib, spwd, xdrlib, cgitb, mailcap, ossaudiodev e sunau foram descontinuados e serão removidos no Python Versão 3.13. Funções PyUnicode_Encode* removidas.

Fonte: opennet.ru

Adicionar um comentário