Após um ano de desenvolvimento lançamento significativo da linguagem de programação . Python 3.9 foi o primeiro lançamento após o projeto em de preparação e manutenção de lançamentos. Os novos lançamentos significativos agora serão produzidos uma vez por ano, e as atualizações corretivas serão lançadas a cada dois meses. Cada ramo significativo será suportado por um ano e meio, após os quais correções para vulnerabilidades serão fornecidas por mais três anos e meio.
O trabalho na nova ramificação agora começa cinco meses antes do lançamento de mais uma ramificação, ou seja, ao mesmo tempo que o lançamento do Python 3.9 a fase de testes alfa do ramo Python 3.10. O ramo Python 3.10 estará na fase de lançamentos alfa por sete meses, durante os quais novos recursos serão adicionados e correções de bugs serão realizadas. Depois disso, durante três meses, ocorrerá o teste de versões beta, durante o qual a adição de novos recursos será proibida e toda a atenção será voltada para a correção de bugs. Os últimos dois meses antes do lançamento o ramo estará na fase candidata a lançamentos, onde será realizada a estabilização final.
no Python 3.9:
- Em dicionários definidos pelo class dict embutido, o suporte aos operadores de fusão «|» e atualização «|=», que complementam os métodos {**d1, **d2} e dict.update, anteriormente propostos para a união de dicionários.
>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}>>> x | y
{"key1": "value1 from x", "key2": "value2 from y", "key3": "value3 from y"}>>> y | x
{"key2": "value2 from x", "key3": "value3 from y", "key1": "value1 from x"} - A coleção de tipos embutidos inclui list, dict e tuple, que podem ser usados como tipos básicos sem importar do módulo typing. Ou seja, em vez de usar typing.List, typing.Dict e typing.Tuple, agora pode-se usar
apenas list, dict e tuple:def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name) - métodos flexíveis para anotar funções e variáveis. Para anexar anotações, o módulo typing adicionou um novo tipo Annotated, que expande os tipos existentes com metadados adicionais que podem ser usados na análise estática ou para otimizações durante a execução. Para acessar os metadados a partir do código, foi adicionado um parâmetro include_extras ao método typing.get_type_hints().
charType = Annotated[int, ctype(«char»)]
UnsignedShort = Annotated[int, struct2.ctype(‘H’)] - os requisitos gramaticais para decoradores — qualquer expressão que seja adequada para uso em blocos if e while agora pode ser usada como um decorador. Essa mudança melhorou significativamente a legibilidade do código PyQt5 e facilitou a manutenção deste módulo:
Era:
button_0 = buttons[0]
@button_0.clicked.connectAgora pode-se escrever:
@buttons[0].clicked.connect - Na biblioteca padrão módulo , incluindo informações do banco de dados de fusos horários IANA.
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Horário de verão
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo(«America/Los_Angeles»))
>>> print(dt)
2020-10-31 12:00:00-07:00>>> dt.tzname()
‘PDT’>>> # Horário padrão
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00>>> print(dt.tzname())
PST - Foi adicionado o módulo graphlib, que suporta ordenação topológica de gráficos.
- novos métodos para remover prefixos e sufixos de strings — str.removeprefix(prefix) e str.removesuffix(suffix). Os métodos foram adicionados aos objetos str, bytes, bytearray e collections.UserString.
>>> s = «FooBar»
>>> s.removeprefix(«Foo»)
‘Bar’ - um novo parser (Gramatica de Expressões de Análise), que substitui o parser . A aplicação do novo parser eliminou algumas "gambiarras" usadas para contornar as limitações do LL(1) e reduziu significativamente o esforço de manutenção do parser. Em termos de desempenho, o novo parser está aproximadamente no mesmo nível que o anterior, mas supera-o em flexibilidade, permitindo maior liberdade ao projetar novos recursos para a linguagem. O código do antigo parser ainda está preservado e pode ser recuperado usando a flag "-X oldparser" ou a variável de ambiente "PYTHONOLDPARSER=1", mas será removido na versão 3.10.
- a capacidade dos métodos de extensões em C de acessar o estado dos módulos em que são definidos, utilizando a desreferenciação direta de ponteiros em vez de procurar o estado do módulo com a função PyState_FindModule. Essa alteração permite aumentar o desempenho dos módulos em C reduzindo ou eliminando totalmente a sobrecarga de verificação do estado do módulo. Para associar um módulo a uma classe, foi proposta a função em C PyType_FromModuleAndSpec(), para obter o módulo e seu estado as funções em C PyType_GetModule() e PyType_GetModuleState(), e para fornecer ao método acesso à classe em que está definido, a função em C PyCMethod e a flag METH_METHOD.
- Coletor de lixo de bloqueios de coleções que incluem objetos reanimados, que permanecem acessíveis externamente após a execução do finalizador.
- Método adicionado , permitindo usar o subsistema do kernel Linux 'pidfd' para tratar da situação de reutilização de PID (pidfd está vinculado a um processo específico e não muda, enquanto o PID pode ser vinculado a outro processo após a finalização do processo atual associado a esse PID).
- O suporte à especificação Unicode foi atualizado para a versão 13.0.0.
- Eliminada durante a reinicialização do interpretador Python em um único processo.
- Foi realizada a otimização de desempenho dos tipos embutidos range, tuple, set, frozenset, list e dict, por meio da aplicação do protocolo de chamada rápida Vectorcall para um acesso mais rápido a objetos escritos em C.
- Os módulos _abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, operator, resource, time e _weakref foram convertidos para carregamento com .
- Os módulos da biblioteca padrão audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios e zlib foram convertidos para usar um ABI limitado , que resolve o problema da compatibilidade de construções de módulos de extensão para diferentes versões do Python (ao atualizar a versão, não é necessário recompilar os módulos de extensão, e módulos construídos para 3.9 funcionarão na versão 3.10).
- No módulo asyncio, devido a potenciais problemas de segurança, o suporte ao parâmetro reuse_address foi descontinuado (o uso de SO_REUSEADDR para UDP no Linux permite que diferentes processos anexem sockets de escuta à porta UDP).
- Novas otimizações foram adicionadas, como o aumento da performance dos manipuladores de sinal em aplicações multithread, o aumento da velocidade do módulo subprocess no ambiente FreeBSD e a aceleração na atribuição de variáveis temporais (a atribuição de variável na expressão «for y in [expr]» agora não é inferior em desempenho à expressão «y = expr»). No geral, a maioria dos testes uma diminuição de desempenho em comparação com a versão 3.8 (aceleração observada apenas nos testes write_local e write_deque):
Versão Python 3.4 3.5 3.6 3.7 3.8 3.9
————— — — — — — —Acesso de leitura a variáveis e atributos:
read_local 7.1 7.1 5.4 5.1 3.9 4.0
read_nonlocal 7.1 8.1 5.8 5.4 4.4 4.8
read_global 15.5 19.0 14.3 13.6 7.6 7.7
read_builtin 21.1 21.6 18.5 19.0 7.5 7.7
read_classvar_from_class 25.6 26.5 20.7 19.5 18.4 18.6
read_classvar_from_instance 22.8 23.5 18.8 17.1 16.4 20.1
read_instancevar 32.4 33.1 28.0 26.3 25.4 27.7
read_instancevar_slots 27.8 31.3 20.8 20.8 20.2 24.5
read_namedtuple 73.8 57.5 45.0 46.8 18.4 23.2
read_boundmethod 37.6 37.9 29.6 26.9 27.7 45.9Acesso de gravação a variáveis e atributos:
write_local 8.7 9.3 5.5 5.3 4.3 4.2
write_nonlocal 10.5 11.1 5.6 5.5 4.7 4.9
write_global 19.7 21.2 18.0 18.0 15.8 17.2
write_classvar 92.9 96.0 104.6 102.1 39.2 43.2
write_instancevar 44.6 45.8 40.0 38.9 35.5 40.7
write_instancevar_slots 35.6 36.1 27.3 26.6 25.7 27.7Acesso de leitura a estruturas de dados:
read_list 24.2 24.5 20.8 20.8 19.0 21.1
read_deque 24.7 25.5 20.2 20.6 19.8 21.6
read_dict 24.3 25.7 22.3 23.0 21.0 22.5
read_strdict 22.6 24.3 19.5 21.2 18.9 21.6Acesso de gravação a estruturas de dados:
write_list 27.1 28.5 22.5 21.6 20.0 21.6
write_deque 28.7 30.1 22.7 21.8 23.5 23.2
write_dict 31.4 33.3 29.3 29.2 24.7 27.8
write_strdict 28.4 29.9 27.5 25.2 23.1 29.8Operações de pilha (ou fila):
list_append_pop 93.4 112.7 75.4 74.2 50.8 53.9
deque_append_pop 43.5 57.0 49.4 49.2 42.5 45.5
deque_append_popleft 43.7 57.3 49.7 49.7 42.8 45.5Tempos de execução:
loop_overhead 0.5 0.6 0.4 0.3 0.3 0.3 - muitas funções e métodos do Python 2.7, que anteriormente foram marcados como obsoletos e que na versão anterior geravam o aviso DeprecationWarning, 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().
Fonte: opennet.ru
