A primeira versão beta do Python 3.13 acaba de ser lançada. Este artigo apresenta um resumo dos novos recursos mais significativos do Python 3.13 e o que eles significam para os desenvolvedores Python. As coisas podem mudar entre agora e o primeiro lançamento de produção do 3.13, mas o primeiro beta significa que todas as principais adições e alterações de recursos estão congeladas.
Novos recursos no primeiro beta do Python 3.13
Aqui está uma primeira olhada nesses novos recursos da versão beta do Python 3.13:
- O JIT experimental
- A versão não-GIL do Python
- Um novo REPL
- Mensagens de erro aprimoradas
- Melhorias nos tipos Python
- Chega de “baterias descarregadas”
O JIT experimental
Python 3.11 introduziu o Interpretador Adaptativo Especializado. Quando o intérprete detecta que algumas operações envolvem previsivelmente os mesmos tipos, essas operações são “especializadas”. O bytecode genérico usado para esse código é trocado por um bytecode específico para trabalhar com esses tipos, o que proporciona aumentos de velocidade de 10% a 25% para essas regiões do código.
Python 3.12 trouxe mais especializações e outros refinamentos ao interpretador. Agora, o Python 3.13 adiciona novos elementos ao JIT que geram código de máquina real em tempo de execução, em vez de apenas bytecode especializado. A aceleração resultante ainda não é grande — talvez 5% — mas abre caminho para otimizações futuras que não eram possíveis anteriormente.
No momento, o JIT é considerado experimental – não está habilitado por padrão e só pode ser habilitado compilando o CPython a partir do código-fonte com determinados sinalizadores. Se com o tempo produzir um aumento significativo de desempenho (5% ou mais) e não impor uma grande carga de gerenciamento à equipe do CPython ou aos usuários do Python como um todo, ele se tornará uma opção de construção totalmente suportada. Se ele será habilitado ou não para lançamentos oficiais, ainda caberá aos gerentes das compilações CPython de uma determinada plataforma.
A versão 'free-threaded' do Python sem GIL
O termo oficial para possíveis versões futuras do CPython sem Global Interpreter Lock (ou GIL) é “CPython de thread livre”. Esta construção do CPython permite que threads sejam executados totalmente em paralelo, sem mediação do GIL. Para esse fim, o trabalho vinculado à CPU que antes só se beneficiava da execução em vários processos pode ser executado em vários tópicos.
O CPython de thread livre também é experimental. Ele não está habilitado por padrão nas compilações enviadas, portanto precisa ser habilitado em tempo de compilação. Se o trabalho futuro com as compilações de thread livre mostrar que ele pode melhorar o desempenho multithread sem afetar o desempenho de thread único, ele será promovido para uma opção totalmente suportada. Com o tempo, a versão free-thread do CPython pode se tornar o padrão.
Um novo REPL
O REPL, ou interpretador interativo, é iniciado quando você executa o Python na linha de comando sem executar um programa. O REPL do Python 3.13 tem melhorias para torná-lo menos enfadonho e mais parecido com um editor real:
- A saída para o console agora tem cores habilitadas por padrão. Este aprimoramento fornece mensagens de erro mais ricas, por exemplo.
- Você pode abrir o interativo
pydoc
ajuda o navegador pressionando F1. - Você pode navegar no histórico da linha de comando com F2.
- Você pode colar grandes blocos de código com mais facilidade pressionando F3 para ativar um modo especial de colagem de blocos.
- Você pode simplesmente digitar
exit
ouquit
em vez deexit()
ouquit()
para sair do REPL.
Observe que atualmente essas melhorias estão disponíveis apenas no Linux e no macOS. Eles não estão disponíveis no Microsoft Windows, nem mesmo ao usar o novo host do console do Windows Terminal.
Mensagens de erro aprimoradas
Os rastreamentos de erros em Python tornaram-se mais precisos e detalhados nas duas últimas versões. Python 3.13 continua nessa trajetória.
- Se você tentar importar algo que tenha o mesmo nome do módulo atualmente no contexto, o Python fornecerá um erro detalhado nesse sentido e o incentivará a renomear o módulo atual. Esta é uma fonte muito frequente de bugs – e não apenas para iniciantes. É um erro comum nomear um módulo com o nome de algo na biblioteca padrão.
- Se você passar para uma função um argumento de palavra-chave incorreto, o erro irá sugerir alguns possíveis argumentos corretos, com base no que está disponível na função que está sendo chamada.
Melhorias nos tipos Python
O sistema de dicas de tipo do Python expandiu-se em funcionalidade e utilidade a cada nova versão. A versão 3.13 adiciona três grandes novas mudanças.
Parâmetros de tipo suportam padrões
typing.TypeVar
, typing.ParamSpec
e typing.TypeVarTuple
todos permitem definir padrões a serem usados se nenhum tipo for especificado explicitamente. Por exemplo:
T = TypeVar("T", default=str)
Nos casos em que T
não é explicitamente definido quando usado, str
é considerado o padrão.
digitação.TypeIs para restrição de tipo
Geralmente em Python, podemos usar isinstance()
para tomar decisões com base em se algo é ou não de um determinado tipo. typing.TypeIs
nos permite fazer a mesma coisa nos mecanismos de dicas de tipo do Python. Dessa forma, as funções usadas para validar se algo é ou não de um determinado tipo podem ser anotadas para mostrar que executam esse comportamento de restrição, em vez de apenas um tipo de retorno. Isso é útil como uma forma de adicionar cobertura precisa do verificador de tipo a essas funções.
digitando.ReadOnly para anotação somente leitura
O typing.TypedDict
type foi criado para anotar dicionários com tipos fixos para os valores associados a determinadas chaves. typing.Readonly
permite anotar valores específicos em um TypedDict como somente leitura. Um exemplo é uma lista que você só pode anexar ou retirar, e não substituir por uma string ou outro tipo.
Chega de 'baterias descarregadas'
O Python 3.11 identificou uma série de módulos de biblioteca padrão do Python que estavam obsoletos e não eram mais mantidos. O plano era marcá-los como obsoletos para 3.11 e 3.12 e, em seguida, removê-los totalmente no Python 3.13. A partir de agora, essas “baterias descarregadas” (como são chamadas) serão removidas permanentemente. Muitos dos módulos removidos podem ser substituídos por módulos de terceiros ou sua funcionalidade pode ser emulada usando outros componentes padrão da biblioteca.
Os usuários também podem esperar mais descontinuações nas próximas três versões do Python. A maioria são métodos para vários componentes de biblioteca padrão que raramente são usados ou não estão documentados.