Após um ano de desenvolvimento, foi publicado um lançamento significativo da linguagem de programação Python 3.11. Este novo ramo será suportado por um ano e meio, após o qual correções de vulnerabilidades serão feitas por mais três anos e meio.
Simultaneamente, começou o teste alfa do ramo Python 3.12 (de acordo com o novo cronograma de desenvolvimento, o trabalho em um novo ramo começa cinco meses antes do lançamento do ramo anterior e, no momento do próximo lançamento, atinge a fase de teste alfa). O ramo Python 3.12 estará na fase de lançamentos alfa por sete meses, durante os quais novas funcionalidades serão adicionadas e correções de bugs serão realizadas. Depois disso, durante três meses, serão realizados testes de versões beta, período em que a adição de novas funcionalidades será proibida e toda a atenção será focada na correção de falhas. Os últimos dois meses antes do lançamento, o ramo estará na fase de candidatos a lançamentos, onde será feita a estabilização final.
Entre as novidades adicionadas ao Python 3.11:
- Um trabalho significativo foi realizado na otimização do desempenho. Esta nova versão inclui mudanças relacionadas ao aumento da velocidade e ao desdobramento em linha da chamada de funções, à aplicação de interpretadores rápidos para operações típicas (x+x, x*x, x-x, a[i], a[i] = z, f(arg) C(arg), o.method(), o.attr = z, *seq), bem como otimizações desenvolvidas pelos projetos Cinder e HotPy. Dependendo do tipo de carga, o aumento na velocidade de execução do código varia de 10% a 60%. Em média, o desempenho em testes do conjunto de dados pyperformance aumentou em 25%.
O mecanismo de cache de bytecode foi reestruturado, o que permitiu reduzir o tempo de inicialização do interpretador em 10-15%. Objetos com código e bytecode agora são alocados estaticamente pelo interpretador, o que possibilitou a eliminação das etapas de desmarshalling do bytecode extraído do cache e da transformação de objetos com código para alocação na memória dinâmica.
- Ao exibir a rastreabilidade de chamadas em mensagens de diagnóstico, há uma saída da informação sobre a expressão que causou o erro (anteriormente somente a linha era destacada sem detalhes sobre qual parte da linha causou o erro). Informações detalhadas sobre a rastreabilidade também podem ser obtidas por meio da API e usadas para mapear instruções de bytecode específicas para uma posição concreta no código-fonte, utilizando o método codeobject.co_positions() ou a função C API PyCode_Addr2Location(). A alteração simplifica significativamente a depuração de problemas relacionados a objetos de dicionário embutidos, chamadas múltiplas de funções 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
- Adicionada a suporte a grupos de exceções, permitindo que o programa gere e processe várias exceções diferentes simultaneamente. Para agrupar várias exceções e invocá-las juntas, foram propostos novos tipos de exceções ExceptionGroup e BaseExceptionGroup, e para destacar exceções individuais de um grupo, foi adicionada a expressão «except*».
- Na classe BaseException, foi adicionado o método add_note(), que permite anexar um texto de nota a uma exceção, por exemplo, adicionar informações contextuais não disponíveis durante a geração da exceção.
- Adicionado um tipo especial Self, que representa a classe atual. Self pode ser usado para anotar métodos que retornam uma instância de sua classe de uma maneira mais simples do que ao usar TypeVar. class MyLock: def __enter__(self) -> Self: self.lock() return self
- Foi adicionado um novo tipo LiteralString, que pode incluir apenas literais de string compatíveis com o tipo LiteralString (ou seja, strings simples e strings do tipo LiteralString, mas não strings arbitrárias ou combinadas do tipo str). O tipo LiteralString pode ser utilizado para restringir a passagem de argumentos de string para funções, onde a substituição arbitrária de partes das strings pode levar a vulnerabilidades, por exemplo, ao formar strings para consultas SQL ou comandos shell. def run_query(sql: LiteralString) -> … … def caller( arbitrary_string: str, query_string: LiteralString, table_name: LiteralString, ) -> None: run_query(«SELECT * FROM students») # ok run_query(literal_string) # ok run_query(«SELECT * FROM » + literal_string) # ok run_query(arbitrary_string) # Erro run_query( # Erro f»SELECT * FROM students WHERE name = {arbitrary_string}» )
- Foi adicionado o tipo TypeVarTuple, permitindo o uso de genéricos variáveis, ao contrário do TypeVar que abrange um tipo, mas também um número arbitrário de tipos.
- A biblioteca padrão agora inclui o módulo tomllib com funções para analisar o formato TOML.
- Foi disponibilizada a possibilidade de etiquetar elementos individuais de dicionários tipados (TypedDict) com os rótulos Required e NotRequired para definir campos obrigatórios e não obrigatórios (por padrão, todos os campos declarados são obrigatórios, a menos que o parâmetro total seja definido como False). class Movie(TypedDict): title: str year: NotRequired[int] m1: Movie = {«title»: «Black Panther», «year»: 2018} # OK m2: Movie = {«title»: «Star Wars»} # OK (campo year é opcional) m3: Movie = {«year»: 2022} # Erro, campo obrigatório title não preenchido)
- Foi adicionado à biblioteca asyncio a classe TaskGroup com a implementação de um gerenciador de contexto assíncrono, aguardando a conclusão de um grupo de tarefas. A adição de tarefas ao grupo é feita através do método create_task(). async def main(): async with asyncio.TaskGroup() as tg: task1 = tg.create_task(some_coro(…)) task2 = tg.create_task(another_coro(…)) print(«Ambas as tarefas foram concluídas agora.»)
- Foi adicionado o decorador de classes, métodos e funções @dataclass_transform, ao qual o sistema de verificação de tipos estáticos trata o objeto como se estivesse usando o decorador @dataclasses.dataclass. No exemplo abaixo, a classe CustomerModel será verificada quanto a tipos de maneira análoga à classe com o decorador @dataclasses.dataclass, ou seja, como tendo o método __init__, que aceita as variáveis id e name. @dataclass_transform() class ModelBase: … class CustomerModel(ModelBase): id: int name: str
- Expressões regulares agora incluem 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 arquivos potencialmente inseguros ao sys.path.
- A ferramenta py.exe para a plataforma Windows foi significativamente aprimorada, incluindo suporte para a sintaxe "-V:/" além de "-.".
- Muitos macros na API C foram convertidos em funções inline normais 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 marcados como obsoletos e serão removidos na versão Python 3.13. As funções PyUnicode_Encode* foram removidas.
Fonte: opennet.ru
