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

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

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster