Os melhores novos recursos e correções no Python 3.12 (2023)

Mensagens de erro melhores, suporte para ferramentas de perfil do Linux e muitas melhorias nas dicas de tipo do Python acabaram de chegar. Vamos dar uma olhada.

PorSerdar Yegulalp

Escritor Sênior,InfoMundo |

Os melhores novos recursos e correções no Python 3.12 (2)
Índice
  • Melhores mensagens de erro
  • Suporte para o Linux perf profiler
  • Depuração/monitoramento de perfil mais rápido
  • Dúvidas de protocolo de buffer
  • Melhorias na digitação
  • Melhorias de desempenho
  • Alterações adicionais

Mostre mais

A linguagem de programação Python lança novas versões anualmente, com uma versão beta bloqueada no primeiro semestre do ano e a versão final no final do ano.

Python 3.12 beta 1 acaba de ser lançado. Os desenvolvedores são incentivados a experimentar esta versão mais recente em código que não seja de produção, tanto para verificar se ela funciona com seus programas quanto para ter uma ideia se seu código se beneficiará dos novos conjuntos de recursos e aprimoramentos de desempenho nesta versão mais recente.

Aqui está um resumo dos novos recursos mais significativos do Python 3.12 e o que eles significam para os desenvolvedores Python.

Melhores mensagens de erro

As mensagens de erro estão ficando mais precisas (posições exatas nas linhas) e mais detalhadas (melhores sugestões sobre o que pode estar errado) nas versões recentes do Python. O Python 3.12 traz aprimoramentos adicionais:

  • Sugestões de módulos ausentes ("você esqueceu de importar o X?") agora incluem módulos da biblioteca padrão.
  • Melhores sugestões de erro para um erro de sintaxe comum com importações; por exemplo,importar p de mretorna um erro perguntando se você quis dizerde m importar p.
  • Erros de importação para um determinado módulo agora incluem sugestões do namespace do módulo importado.
  • NameErroras sugestões agora também incluemauto.anexado ao nome quando gerado dentro de uma instância de classe (por exemplo,nome 'velocidade' não está definido. Será que quis dizer 'self.speed'?). Isso porque omitirautopara variáveis ​​de instância é uma fonte comum de erros em instâncias de classe.

Suporte para o Linux perf profiler

A ferramenta de perfil do Linux amplamente usadadesempenhofunciona com Python, mas apenas retorna informações sobre o que está acontecendo no nível C no tempo de execução do Python. Informações sobre realprograma Pythonas funções não aparecem.

Python 3.12ativa um modo de ativaçãopermitirdesempenhopara coletar detalhes sobre programas Python. O opt-in pode ser feito no nível do ambiente ou dentro de um programa Python com osys.activate_stack_trampolinefunção.

Depuração/monitoramento de perfil mais rápido

Executar um criador de perfil ou anexar um depurador a um programa Python oferece visibilidade e percepção sobre o que o programa está fazendo. Também tem um custo de desempenho. Os programas podem ser executados até uma ordem de grandeza mais lenta quando executados por meio de um depurador ou criador de perfil.

PEP 669fornece ganchos para eventos de objeto de código aos quais criadores de perfil e depuradores podem se conectar, como o início ou o fim de uma função. Uma função de retorno de chamada pode ser registrada por uma ferramenta para disparar sempre que tal evento for acionado. Ainda haverá um impacto no desempenho para criação de perfil ou depuração, mas será bastante reduzido.

Dúvidas de protocolo de buffer

do Pythonprotocolo de bufferfornece uma maneira de obter acesso à região bruta da memória agrupada por muitos objetos Python, comobytesoubytearray. Mas a maioria das interações com o protocolo de buffer ocorre por meio de extensões C. Até agora, não era possível para o código Python saber se um determinado objeto suporta o protocolo de buffer ou digitar o código como sendo compatível com o protocolo.

PEP 688implementa novos métodos dunder para objetos que permitem que o código Python funcione com o protocolo de buffer. Isso torna mais fácil escrever objetos em Python que expõem seus buffers de dados, em vez de ter que escrever esses objetos em C. O__amortecedor__O método pode ser usado para código que aloca nova memória ou simplesmente acessa a memória existente; ele retorna umvisualização de memóriaobjeto. O__release_buffer__O método é usado para liberar a memória usada para o buffer.

No momento, os métodos PEP 688 não têm como indicar se um determinado buffer é somente leitura ou não - o que é útil se você estiver lidando com dados para um objeto imutável comobytes. Mas a porta está aberta para adicionar esse recurso, se necessário.

Melhorias na digitação

A sintaxe de dica de tipo do Python, adicionada no Python 3.5, permite que as ferramentas de linting detectem uma ampla variedade de erros com antecedência. A cada nova versão, a digitação em Python ganha recursos para cobrir uma gama mais ampla e granular de casos de uso.

TypedDict

No Python 3.12, você pode usar umTypedDictcomo fonte de tipos para sugerir argumentos de palavra-chave usados ​​em uma função. ODescompactar variadic genérico, introduzido na versão 3.11, é usado para isso. Aqui está um exemplo do PEP relevante:

class Movie(TypedDict): name: str ano: intdef foo(**kwargs: Unpack[Movie]) -> None: ...

Aqui,foopode receber argumentos de palavras-chave de nomes e tipos que correspondem ao conteúdo deFilmenome:streano:int. Um cenário em que isso é útil são as funções de dica de tipo que aceitam argumentos somente de palavra-chave opcionais sem valores padrão.

Sintaxe do parâmetro de tipo

Osintaxe de parâmetro de tipofornece uma maneira mais limpa de especificar tipos em uma classe genérica, função ou alias de tipo. Aqui está um exemplo retirado do PEP:

# o método antigo da digitação import TypeVar_T = TypeVar("_T")def func(a: _T, b: _T) -> _T: ...# o novo parâmetro de tipo methoddef func[T](a: T, b: T) -> T: ...

Com o novo método, não é preciso importarTypeVar. Pode-se apenas usar ofunção[T]sintaxe para indicar referências de tipo genérico. Também é possível especificar limites de tipo, como se um determinado tipo pertence a um grupo de tipos, embora esses tipos não possam ser genéricos. Um exemplo éfunção[T: (str,int)].

Finalmente, o novo@override decoradorpode ser usado para sinalizar métodos que substituem métodos em um pai, como uma forma de garantir que quaisquer alterações feitas no pai durante a refatoração (renomear ou excluir) também sejam refletidas em seus filhos.

Melhorias de desempenho

Com o Python 3.11, vários projetos aliados começaram a melhorar o desempenho do Python aos trancos e barrancos a cada nova versão. As melhorias de desempenho no Python 3.12 não são tão dramáticas, mas ainda são dignas de nota.

Inlining de compreensão

compreensões, uma sintaxe que permite construir rapidamente listas, dicionários e conjuntos,agora são construídos "em linha"e não por meio de objetos temporários. A aceleração para isso foi cronometrada em cerca de 11% para um caso do mundo real e até duas vezes mais rápido para um micro-benchmark.

objetos imortais

Cada objeto em Python tem uma contagem de referência que rastreia quantas vezes outros objetos se referem a ele, incluindo objetos integrados comoNenhum.PEP 683permite que os objetos sejam tratados como "imortais", para que nunca tenham sua contagem de referência alterada.

Tornar os objetos imortais tem outras implicações poderosas para o Python a longo prazo. Isso facilita a implementação do escalonamento multicore e a implementação de outras otimizações (comoevitando copy-on-write) que teria sido difícil de implementar antes.

Tamanhos de objetos menores

Com versões anteriores do Python, o tamanho base de um objeto era de 208 bytes. Os objetos foram refatorados várias vezes nas últimas versões do Python para torná-los menores, o que não apenas permite que mais objetos vivam na memória, mas também ajuda na localização do cache. A partir do Python 3.12, o tamanho base de um objeto agora é de 96 bytes, menos da metade do que costumava ser.

Subintérpretes

Um recurso muito esperado para Python ésubintérpretes— a capacidade de ter várias instâncias de um interpretador, cada uma com seu próprio GIL, executando lado a lado em um único processo Python. Este seria um grande passo em direção a um paralelismo melhor em Python.

No entanto, a versão 3.12 inclui apenas os componentes internos do CPython para tornar isso possível. Ainda não há interface de usuário final para subintérpretes. Amódulo de biblioteca padrão,intérpretes, destina-se a fazer isso, mas agora está programado para aparecer no Python 3.13.

Alterações adicionais

O Python 3.12 lança inúmeras outras pequenas mudanças além das grandes discutidas até agora. Aqui está uma olhada rápida.

API instável

Um projeto importante em andamento tem sido a refatoração dos componentes internos do CPython, especialmente seus conjuntos de API, para que menos funções de baixo nível do CPython precisem ser expostas. O Python 3.12 introduziu ocamada de API instável, um conjunto de API marcado especificamente como provável de mudar entre as versões. Não se destina a ser usado pela maioria das extensões C, mas por ferramentas de baixo nível, como depuradores ou compiladores JIT.

Reprovações e remoções da biblioteca padrão

Com a versão 3.11, vários módulos de biblioteca padrão há muito conhecidos por serem obsoletos (os chamadosbaterias mortas) foi sinalizado para remoção a partir do Python 3.12 e 3.13. Na versão 3.12, uma das maiores remoções foidistutil, o que há muito foi evitado porferramentas de configuração. Outros módulos removidos nesta versão foramassíncrono, assíncrono(ambos substituídos porassíncrono), esmtpd.

Coleta de lixo

O mecanismo de coleta de lixo (GC) do Python costumava ser executado sempre que um objeto era alocado. A partir do Python 3.12, o GC é executado apenas no mecanismo "eval breaker" no loop de bytecode do Python - ou seja, entre a execução de um bytecode e outro. Ele também é executado sempre que o mecanismo de verificação do manipulador de sinal do CPython é invocado. Isso torna possível executar o GC periodicamente em uma chamada de longa duração para um ramal C fora do tempo de execução.

Em seguida, leia isto:

  • O melhor software de código aberto de 2022
  • Os desenvolvedores não querem fazer operações
  • 7 razões pelas quais o Java ainda é ótimo
  • Por que Wasm é o futuro da computação em nuvem
  • Por que as estimativas de engenharia de software são lixo
  • Integração contínua e entrega contínua explicadas

Relacionado:

  • Pitão
  • Linguagens de programação

Serdar Yegulalp é um escritor sênior da InfoWorld, com foco em aprendizado de máquina, conteinerização, devops, o ecossistema Python e revisões periódicas.

Seguir

Direitos autorais © 2023 IDG Communications, Inc.

Top Articles
Latest Posts
Article information

Author: Fredrick Kertzmann

Last Updated: 06/13/2023

Views: 5277

Rating: 4.6 / 5 (66 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Fredrick Kertzmann

Birthday: 2000-04-29

Address: Apt. 203 613 Huels Gateway, Ralphtown, LA 40204

Phone: +2135150832870

Job: Regional Design Producer

Hobby: Nordic skating, Lacemaking, Mountain biking, Rowing, Gardening, Water sports, role-playing games

Introduction: My name is Fredrick Kertzmann, I am a gleaming, encouraging, inexpensive, thankful, tender, quaint, precious person who loves writing and wants to share my knowledge and understanding with you.