Python 3.10

O Python 3.10.0 (final) foi lançado em 4 de outubro de 2021. Os recursos da versão 3.10 estão definidos na PEP 619 e uma descrição detalhada das mudanças pode ser encontrada em O que há de novo no Python 3.10.

Novos recursos de sintaxe

Status

PEP 634

Correspondência Estrutural de Padrões: Especificação

[1]

PEP 635

Correspondência Estrutural de Padrões: Motivação e Justificativa

[1]

PEP 636

Correspondência Estrutural de Padrões: Tutorial

[1]

bpo-12782

Gerenciadores de contexto entre parênteses agora são oficialmente permitidos

Novos recursos na biblioteca padrão

PEP 618

Adicionar verificação opcional de comprimento ao zip

Melhorias no interpretador

PEP 626

Números de linha precisos para depuração e outras ferramentas

Novos recursos de tipagem

PEP 604

Permitir escrever tipos de união como X | Y

PEP 613

Aliases de Tipo Explícitos

PEP 612

Variáveis de Especificação de Parâmetros

Descontinuações, remoções ou restrições importantes

PEP 644

Exigir OpenSSL 1.1.1 ou mais recente

PEP 632

Descontinuar o módulo distutils.

Não relevante

PEP 623

Descontinuar e preparar a remoção do membro wstr em PyUnicodeObject.

Não relevante

PEP 624

Remover as APIs do codificador Py_UNICODE

Não relevante

PEP 597

Adicionar EncodingWarning opcional

Outras Mudanças na Linguagem:

O tipo int tem um novo método int.bit_count(), que retorna o número de uns na expansão binária de um determinado inteiro, também conhecido como contagem de população.

As views retornadas por dict.keys(), dict.values() e dict.items() agora possuem um atributo mapping que fornece um objeto types.MappingProxyType que envolve o dicionário original.

PEP 618: A função zip() agora tem um sinalizador opcional strict, usado para exigir que todos os iteráveis tenham comprimento igual.

Funções embutidas e de extensão que recebem argumentos inteiros não aceitam mais Decimals, Fractions e outros objetos que só podem ser convertidos em inteiros com perda (por exemplo, que têm o método __int__(), mas não têm o método __index__()).

Se object.__ipow__() retornar NotImplemented, o operador recorrerá corretamente a object.__pow__() e object.__rpow__() conforme esperado.

Expressões de atribuição agora podem ser usadas sem parênteses dentro de literais de conjunto e compreensões de conjunto, bem como em índices de sequência (mas não em fatias).

As funções têm um novo atributo __builtins__ que é usado para procurar símbolos embutidos quando uma função é executada, em vez de procurar em __globals__['__builtins__']. O atributo é inicializado a partir de __globals__["__builtins__"] se ele existir, caso contrário, a partir dos builtins atuais.

Duas novas funções embutidas – aiter() e anext() foram adicionadas para fornecer equivalentes assíncronos a iter() e next(), respectivamente.

Métodos estáticos (@staticmethod) e métodos de classe (@classmethod) agora herdam os atributos do método (__module__, __name__, __qualname__, __doc__, __annotations__) e têm um novo atributo __wrapped__. Além disso, métodos estáticos agora podem ser chamados como funções comuns.

Anotações para alvos complexos (tudo além dos alvos simple name definidos pela PEP 526) não causam mais nenhum efeito em tempo de execução com from __future__ import annotations.

Objetos de classe e de módulo agora criam preguiçosamente dicionários de anotações vazios sob demanda. Os dicionários de anotações são armazenados no __dict__ do objeto para compatibilidade retroativa. Isso melhora as boas práticas para trabalhar com __annotations__.

Anotações que consistem em yield, yield from, await ou expressões nomeadas agora são proibidas sob from __future__ import annotations devido aos seus efeitos colaterais.

O uso de variáveis não vinculadas, super() e outras expressões que possam alterar o processamento da tabela de símbolos como anotações agora se tornam sem efeito sob from __future__ import annotations.

Os hashes de valores NaN, tanto do tipo float quanto do tipo decimal.Decimal, agora dependem da identidade do objeto. Anteriormente, eles sempre tinham hash 0, embora valores NaN não sejam iguais entre si. Isso causava um comportamento potencialmente quadrático em tempo de execução devido a colisões excessivas de hash ao criar dicionários e conjuntos contendo múltiplos NaNs.

Um SyntaxError (em vez de um NameError) será levantado ao excluir a constante __debug__.

As exceções SyntaxError agora têm os atributos end_lineno e end_offset. Eles serão None se não forem determinados.

Mudanças nos módulos embutidos:

asyncio

Adiciona o método ausente connect_accepted_socket().

array

O método index() de array.array agora tem parâmetros opcionais start e stop.

gc

Adiciona ganchos de auditoria para gc.get_objects(), gc.get_referrers() e gc.get_referents().

hashlib

O módulo hashlib requer OpenSSL 1.1.1 ou mais recente.

O módulo hashlib tem suporte preliminar para OpenSSL 3.0.0.

A implementação alternativa em Python puro de pbkdf2_hmac() está descontinuada. No futuro, o PBKDF2-HMAC só estará disponível quando o Python tiver sido compilado com suporte a OpenSSL.

os

Adiciona suporte a os.cpu_count() para o VxWorks RTOS.

Adiciona uma nova função os.eventfd() e auxiliares relacionados para envolver a chamada de sistema eventfd2 no Linux.

Adiciona os.splice(), que permite mover dados entre dois descritores de arquivo sem copiar entre o espaço de endereçamento do kernel e o espaço de endereçamento do usuário, onde um dos descritores de arquivo deve se referir a um pipe.

Adiciona O_EVTONLY, O_FSYNC, O_SYMLINK e O_NOFOLLOW_ANY para macOS.

platform

Adiciona platform.freedesktop_os_release() para recuperar a identificação do sistema operacional a partir do arquivo padrão os-release do freedesktop.org.

socket

A exceção socket.timeout agora é um alias de TimeoutError.

Adiciona a opção de criar sockets MPTCP com IPPROTO_MPTCP.

Adiciona a opção IP_RECVTOS para receber os campos de tipo de serviço (ToS) ou DSCP/ECN.

ssl

O módulo ssl requer OpenSSL 1.1.1 ou mais recente.

O módulo ssl tem suporte preliminar para OpenSSL 3.0.0 e uma nova opção OP_IGNORE_UNEXPECTED_EOF.

Funções descontinuadas e o uso de constantes descontinuadas agora resultam em um DeprecationWarning. ssl.SSLContext.options tem OP_NO_SSLv2 e OP_NO_SSLv3 definidos por padrão e, portanto, não pode avisar sobre a definição do sinalizador novamente.

O módulo ssl agora tem configurações padrão mais seguras. Cifras sem sigilo de encaminhamento ou com MAC SHA-1 estão desabilitadas por padrão. O nível de segurança 2 proíbe chaves RSA, DH e ECC fracas com menos de 112 bits de segurança. SSLContext usa por padrão a versão mínima de protocolo TLS 1.2. As configurações são baseadas na pesquisa de Hynek Schlawack.

Os protocolos descontinuados SSL 3.0, TLS 1.0 e TLS 1.1 não são mais oficialmente suportados. O Python não os bloqueia ativamente. No entanto, opções de compilação do OpenSSL, configurações de distribuição, patches de fornecedores e suítes de cifras podem impedir um handshake bem-sucedido.

Adiciona um parâmetro timeout à função ssl.get_server_certificate().

O módulo ssl usa heap-types e inicialização em múltiplas fases.

Um novo sinalizador de verificação VERIFY_X509_PARTIAL_CHAIN foi adicionado.

sys

Adiciona o atributo sys.orig_argv: a lista dos argumentos originais de linha de comando passados ao executável do Python.

Adiciona sys.stdlib_module_names, contendo a lista dos nomes dos módulos da biblioteca padrão.

_thread

_thread.interrupt_main() agora recebe um número de sinal opcional a simular (o padrão ainda é signal.SIGINT).

Notas