O primeiro beta completo do Python 3.15 chegou e é um dos lançamentos do Python com mais recursos em muitas luas. Aqui está um resumo das maiores, mais ousadas e importantes inovações, mudanças e correções.
Importações preguiçosas
Um recurso há muito solicitado, as importações lentas permitem que as importações sejam processadas apenas quando são realmente usadas pelo programa. Assim, para módulos de importação lenta que impõem um grande custo no tempo de inicialização de um programa, agora você pode facilmente adiar esse custo para quando o código desse módulo for realmente executado.
Você pode usar importações lentas explicitamente usando a nova sintaxe de importação lenta, mas também pode forçar o código com importações convencionais a se comportar de forma lenta, seja programaticamente ou usando uma variável de ambiente. Isso torna mais fácil fazer com que o código existente aproveite esse recurso sem muita reescrita. O melhor de tudo é que não há nenhuma desvantagem em tornar as importações preguiçosas: caso contrário, elas se comportam exatamente como pretendido.
O tipo integrado frozendict
Raramente o Python adiciona um novo tipo de dados, mas esta é uma adição há muito debatida e desejada: o dicionário congelado. O frozendict se comporta como um dicionário normal, exceto que é imutável (você não pode adicionar, remover ou alterar elementos) e é hashable (então você pode usá-lo como chave em outro dicionário, por exemplo).
O tipo integrado sentinela()
Outra nova adição à linguagem pretende substituir um padrão comum e problemático do Python: a criação de um objeto sentinela exclusivo (como uma alternativa ao None onde None poderia ser um valor válido, por exemplo) usando object(). A nova sintaxe,sentinel("NAME")cria objetos únicos que se comparam apenas a si mesmos por meio do is operador. Esses objetos podem ser verificados de tipo corretamente e possuem uma representação informativa em vez de apenas um descritor de objeto aleatório.
Um perfilador de amostragem estatística
O de longa data cProfile O módulo cria o perfil do código Python de forma determinística – ou seja, ele rastreia e registra cada chamada. Isso o torna preciso, mas também significa uma cProfileO programa rastreado é executado muito mais lentamente que o normal. Um novo módulo de criação de perfil em Python 3.15, profiling.samplingusa métodos de amostragem estatística para coletar informações úteis sobre o desempenho com uma fração do impacto na velocidade do programa. O existente cProfile O profiler ainda está disponível – não vai desaparecer – mas tem um novo nome alternativo, profiling.tracing.
Um JIT atualizado
O compilador just-in-time (JIT) integrado do CPython estreou no Python 3.13. Seus objetivos de longo prazo são fazer com que os programas Python rodem mais rápido, sem quaisquer alterações no código, da mesma forma que o tempo de execução alternativo do Python, PyPy, pode acelerar as coisas. E isso vem sem o custo de mudar para um intérprete totalmente diferente, com algumas de suas próprias limitações.
As primeiras revisões do JIT não prometiam, nem entregavam, uma grande velocidade adicional, pois tratavam mais de estabelecer uma base para melhorias futuras. Com o Python 3.15, porém, o JIT agora mostra uma melhoria média geométrica de desempenho de 8% a 13% em relação ao CPython padrão, dependendo da plataforma e da carga de trabalho. As maiores mudanças incluem um novo front-end de rastreamento (para permitir mais acelerações em mais tipos de código), o uso de alocação de registro para um trabalho mais rápido e com maior eficiência de memória, melhor código de máquina gerado pelo JIT e otimizações adicionais, como a eliminação de contagens de referência para algumas classes de objetos.
Melhores mensagens de erro
As mensagens de erro em Python tornaram-se mais precisas, detalhadas e úteis nas últimas versões, e o Python 3.15 continua esse trabalho. Os destaques:
- Sugestões para nomes ausentes (“
xnão tem atributo ‘y‘. Você quis dizer ‘xyz‘?”) agora incluem sugestões dos membros de um determinado objeto, e não apenas do objeto em si. - As sugestões agora também abrangem verificações para exclusão de atributos, não apenas para acessá-los.
- Se o intérprete não conseguir sugerir um método baseado na correspondência difusa de nomes via distância de Levenshtein, ele consultará uma lista de nomes comumente usados em outras linguagens para tais métodos. Por exemplo, se você tentar usar
list.push()(um método JavaScript), o intérprete sugere.append()o método adequado para listas Python.
Digite melhorias no sistema
O TypedDict classe, que permite criar dicionários com chaves predefinidas e chaves e valores sugeridos por tipo, adiciona suporte para dois novos argumentos em sua definição. O closed argumento permite que você especifique se apenas as chaves especificadas podem ser usadas em tempo de execução. O extra_items O argumento permite especificar chaves adicionais em tempo de execução, mas apenas chaves com um valor de um tipo especificado.
O TypeForm A definição de tipo permite representar o valor resultante da avaliação de uma expressão de tipo. Com isso, as anotações de tipo podem ser usadas em locais onde o próprio tipo está sendo usado como valor – por exemplo, variações em operações como typing.cast ou mesmo isinstanceou como parte do funcionamento de uma ferramenta de verificação de tipo de terceiros.
Descompactando em compreensões
Este é outro recurso há muito solicitado. Se você quisesse descompactar ou “achatar” completamente um objeto aninhado usando uma compreensão, você precisava de uma função como itertools.chain() ou você teria que escrever uma compreensão aninhada com uma sintaxe feia:
x = ((1,2,3),(4,5),(6))
y = (a for b in x for a in b)
>>> (1, 2, 3, 4, 5, 6) # y
Descompactar as compreensões usando o operador estrela permite que você economize uma etapa:
x = ((1,2,3),(4,5),(6))
y = (*a for a in x)
>>> (1, 2, 3, 4, 5, 6) # y
Desempacotando com ** também funciona, por exemplo, como uma forma de nivelar e combinar dicionários:
dicts = ({'a': 1}, {'b': 2}, {'a': 3})
y = {**d for d in dicts}
>>> {'a': 3, 'b': 2}
Finalmente, este tipo de descompactação também pode ser usado para formar expressões geradoras:
(*x for x in ("ab","cd","ef"))
A expressão acima cria um gerador que produz:
('a', 'b', 'c', 'd', 'e', 'f')
Revertendo o coletor de lixo incremental
Finalmente, o Python 3.15 dá uma reviravolta importante. O Python 3.14 apresentou uma grande mudança em seu sistema de coleta de lixo – um coletor de lixo incremental destinado a reduzir o tempo de parada do programa necessário para coletar o lixo. Infelizmente, muitos usuários relataram que o novo coletor de lixo aumenta o uso de memória do processo, às vezes dramaticamente. O Python 3.15 retornará ao coletor de lixo geracional mais antigo usado no Python 3.13 e anteriores. O coletor incremental pode retornar em uma versão futura, mas não sem trabalho adicional para evitar que esse problema reapareça.
