Após um ano de desenvolvimento apresentado lançamento significativo de linguagem de programação Python 3.9. Python 3.9 foi o primeiro lançamento depois перехода projeto em novo ciclo preparação e suporte de lançamentos. Agora, novos lançamentos principais serão gerados uma vez por ano e atualizações corretivas serão lançadas a cada dois meses. Cada filial significativa terá suporte por um ano e meio, após o qual serão desenvolvidos mais três anos e meio para corrigir vulnerabilidades.
O trabalho em uma nova filial agora começa cinco meses antes do lançamento da próxima filial, ou seja, coincidindo com o lançamento do Python 3.9 começou teste alfa do branch Python 3.10. O branch Python 3.10 estará em versão alfa por sete meses, durante os quais novos recursos serão adicionados e bugs corrigidos. Depois disso, as versões beta serão testadas por três meses, durante os quais será proibida a adição de novos recursos e toda atenção será dada à correção de bugs. Nos últimos dois meses antes do lançamento, a filial estará na fase de release candidate, na qual será realizada a estabilização final.
Em dicionários definidos usando a classe dict integrada, apareceu suporte para operadores de mesclagem "|" e atualizações "|=", que complementam os métodos {**d1, **d2} e dict.update propostos anteriormente para mesclar dicionários.
>>> x = {"chave1": "valor1 de x", "chave2": "valor2 de x"}
>>> y = {"chave2": "valor2 de y", "chave3": "valor3 de y"}
>>> x | sim
{'chave1': 'valor1 de x', 'chave2': 'valor2 de y', 'chave3': 'valor3 de y'}
>>> e | x
{'chave2': 'valor2 de x', 'chave3': 'valor3 de y', 'chave1': 'valor1 de x'}
A coleção interna de tipos inclui list, dict e tuple, que podem ser usados como tipos base sem importar do módulo de digitação. Aqueles. em vez de digitação.List, digitação.Dict e digitação.Tuple agora você pode especificar
apenas listar, ditar e tupla:
def greet_all(nomes: lista[str]) -> Nenhum:
para nome em nomes:
print("Olá", nome)
São fornecidos ferramentas flexíveis para anotar funções e variáveis. Para anexar anotações, um novo tipo Anotado foi adicionado ao módulo de digitação, estendendo os tipos existentes com metadados adicionais que podem ser usados para análise estática ou para otimizações em tempo de execução. Para acessar metadados do código, o parâmetro include_extras foi adicionado ao método tipagem.get_type_hints().
Atenuado requisitos gramaticais para decoradores - qualquer expressão adequada para uso em blocos if e while agora pode ser usada como decorador. A mudança melhorou significativamente a legibilidade do código PyQt5 e simplificou a manutenção deste módulo:
Agora você pode escrever:
@buttons[0].clicked.connect
Para a biblioteca padrão adicionado módulo Zoneinfo, que inclui informações do banco de dados de fuso horário da IANA.
>>> de zoneinfo importar ZoneInfo
>>> de importação de data e hora data e hora, timedelta
>>> # Horário de verão
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("América/Los_Angeles"))
>>> imprimir(dt)
2020-10-31 12:00:00-07:00
Adicionado módulo graphlib, no qual implementado suporte para classificação topológica de gráficos.
Proposto novos métodos para remover prefixos e finais de linha - str.removeprefix(prefix) e str.removesuffix(suffix). Métodos foram adicionados aos objetos str, bytes, bytearray e Collections.UserString.
>>> s = "FooBar"
>>> s.removeprefix("Foo")
'Bar'
Envolvido novo analisador PEG (Parsing Expression Grammar), que substituiu o analisador LL (1). A utilização do novo analisador permitiu eliminar alguns dos “hacks” utilizados para contornar as restrições do LL(1) e reduziu significativamente os custos de mão-de-obra para manutenção do analisador. Em termos de desempenho, o novo analisador está aproximadamente no mesmo nível do anterior, mas está significativamente à frente dele em termos de flexibilidade, o que permite que você se sinta mais livre ao projetar novos recursos de linguagem. O código antigo do analisador é mantido por enquanto e pode ser retornado usando o sinalizador "-X oldparser" ou a variável de ambiente "PYTHONOLDPARSER=1", mas será removido na versão 3.10.
Fornecido por a capacidade dos métodos de extensão C acessarem o estado dos módulos nos quais são definidos usando desreferência direta do ponteiro em vez de procurar o estado do módulo usando a função PyState_FindModule. A alteração permite aumentar o desempenho dos módulos C, reduzindo ou eliminando completamente a sobrecarga de verificação do estado do módulo. Para associar um módulo a uma classe, é proposta a função C PyType_FromModuleAndSpec(), para obter o módulo e seu estado, são propostas as funções C PyType_GetModule() e PyType_GetModuleState(), e para fornecer um método com acesso à classe no qual é definido, são propostas a função C PyCMethod e a flag METH_METHOD.
Coletor de lixo entregue de bloquear coleções contendo objetos reanimados que permanecem acessíveis externamente após a execução do finalizador.
Método adicionado os.pidfd_open, que permite que o subsistema do kernel Linux "pidfd" seja usado para lidar com a situação de reutilização do PID (o pidfd está associado a um processo específico e não muda, enquanto um PID pode ser associado a outro processo após o processo atual associado a esse PID terminar ).
O suporte para a especificação Unicode foi atualizado para a versão 13.0.0.
Eliminado vazamento de memória ao reinicializar o interpretador Python no mesmo processo.
O desempenho dos tipos integrados range, tuple, set, frozenset, list e dict foi otimizado. implementado através do uso do protocolo de atalho Vectorcall para acesso mais rápido a objetos escritos na linguagem C.
Os módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operador, recurso, tempo e _weakref foram movidos para carregamento de inicialização em vários estágios.
Os módulos da biblioteca padrão audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib foram convertidos para uso restrito ABI estável, que resolve o problema da operabilidade de montagens de módulos de extensão para diferentes versões do Python (ao atualizar a versão, não há necessidade de reconstruir os módulos de extensão, e os módulos compilados para 3.9 poderão funcionar no branch 3.10).
O módulo asyncio tem suporte obsoleto para o parâmetro reuse_address devido a possíveis problemas de segurança (usar SO_REUSEADDR para UDP no Linux permite que diferentes processos conectem soquetes de escuta a uma porta UDP).
Novas otimizações foram adicionadas, por exemplo, melhor desempenho de manipuladores de sinal em aplicações multi-threaded, maior velocidade do módulo de subprocesso no ambiente FreeBSD e atribuição mais rápida de variáveis temporárias (atribuindo uma variável na expressão “for y in [expr ]” agora tem o mesmo desempenho que a expressão “y = expr” "). Em geral, a maioria dos testes mostrar diminuição de desempenho em comparação com o branch 3.8 (a aceleração é observada apenas nos testes write_local e write_deque):
Ciclo de tempo:
sobrecarga_de_loop 0.5 0.6 0.4 0.3 0.3 0.3
Removido muitas funções e métodos do Python 2.7 que foram obsoletos anteriormente e resultaram em um DeprecationWarning na versão anterior, incluindo o método unescape() em html.parser.HTMLParser,
tostring() e fromstring() em array.array, isAlive() em threading.Thread, getchildren() e getiterator() em ElementTree, sys.getcheckinterval(), sys.setcheckinterval(), asyncio.Task.current_task(), asyncio.Task.all_tasks(), base64.encodestring() e base64.decodestring().