Python 3.10

O Python 3.10.0 (final) foi lançado a 4 de outubro de 2021. As funcionalidades do 3.10 estão definidas na PEP 619 e uma descrição detalhada das alterações pode ser encontrada em What’s New in Python 3.10.

Novas funcionalidades de sintaxe

Estado

PEP 634

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

[1]

PEP 635

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

[1]

PEP 636

Correspondência Estrutural de Padrões: Tutorial

[1]

bpo-12782

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

Novas funcionalidades na biblioteca padrão

PEP 618

Adicionar verificação opcional do comprimento ao zip

Melhorias no interpretador

PEP 626

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

Novas funcionalidades de tipagem

PEP 604

Permitir escrever tipos de união como X | Y

PEP 613

Aliases de tipos explícitos

PEP 612

Variáveis de especificação de parâmetros

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

PEP 644

Exigir OpenSSL 1.1.1 ou mais recente

PEP 632

Depreciar o módulo distutils.

Não relevante

PEP 623

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

Não relevante

PEP 624

Remover as APIs de codificação Py_UNICODE

Não relevante

PEP 597

Adicionar EncodingWarning opcional

Outras alterações à linguagem:

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

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

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

As funções incorporadas e de extensão que aceitam argumentos inteiros já não aceitam Decimals, Fractions e outros objetos que só podem ser convertidos para inteiros com perda (por exemplo, os que têm o método __int__() mas não têm o método __index__()).

Se object.__ipow__() devolver NotImplemented, o operador irá agora recorrer corretamente a object.__pow__() e object.__rpow__() como esperado.

As expressões de atribuição podem agora ser utilizadas sem parênteses em literais de conjunto e compreensões de conjunto, bem como em índices de sequências (mas não em fatias).

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

Foram adicionadas duas novas funções incorporadas – aiter() e anext() – para fornecer equivalentes assíncronos de iter() e next(), respetivamente.

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

As anotações para alvos complexos (tudo exceto alvos do tipo simple name definidos por PEP 526) já não causam quaisquer efeitos em tempo de execução com from __future__ import annotations.

Os objetos de classe e de módulo criam agora de forma lazy dicionários de anotações vazios sob pedido. Os dicionários de anotações são armazenados no __dict__ do objeto para compatibilidade com versões anteriores. Isto melhora as boas práticas para trabalhar com __annotations__.

As anotações compostas por yield, yield from, await ou expressões nomeadas são agora proibidas sob from __future__ import annotations devido aos seus efeitos secundários.

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

Os hashes de valores NaN tanto do tipo float como do tipo decimal.Decimal dependem agora da identidade do objeto. Anteriormente, eram sempre mapeados para 0, mesmo que os valores NaN não sejam iguais entre si. Isto causava um comportamento de execução potencialmente quadrático devido a colisões excessivas de hashes ao criar dicionários e conjuntos com múltiplos NaNs.

Será levantada uma SyntaxError (em vez de NameError) ao eliminar a constante __debug__.

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

Alterações aos módulos incorporados:

asyncio

Adicionar o método connect_accepted_socket() em falta.

array

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

gc

Adicionar 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.

O substituto puro em Python de pbkdf2_hmac() está depreciado. No futuro, o PBKDF2-HMAC só estará disponível quando o Python for compilado com suporte OpenSSL.

os

Adicionar suporte de os.cpu_count() para VxWorks RTOS.

Adicionar uma nova função os.eventfd() e auxiliares relacionados para encapsular a syscall eventfd2 no Linux.

Adicionar os.splice() que permite mover dados entre dois descritores de ficheiro sem cópia entre o espaço de endereços do kernel e o espaço do utilizador, onde um dos descritores de ficheiro tem de se referir a um pipe.

Adicionar O_EVTONLY, O_FSYNC, O_SYMLINK e O_NOFOLLOW_ANY para macOS.

platform

Adicionar platform.freedesktop_os_release() para obter a identificação do sistema operativo a partir do ficheiro padrão freedesktop.org os-release.

socket

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

Adicionar opção para criar sockets MPTCP com IPPROTO_MPTCP.

Adicionar a opção IP_RECVTOS para receber o tipo de serviço (ToS) ou campos 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 a nova opção OP_IGNORE_UNEXPECTED_EOF.

As funções depreciadas e a utilização de constantes depreciadas resultam agora numa DeprecationWarning. ssl.SSLContext.options tem OP_NO_SSLv2 e OP_NO_SSLv3 definidos por omissão e por isso não podem avisar sobre a definição do sinalizador novamente.

O módulo ssl tem agora definições predefinidas mais seguras. Os cifras sem sigilo futuro (forward secrecy) ou com MAC SHA-1 estão desativados por omissã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 omissão a versão mínima de protocolo TLS 1.2. As definições são baseadas na investigação de Hynek Schlawack.

Os protocolos depreciados SSL 3.0, TLS 1.0 e TLS 1.1 já não são oficialmente suportados. O Python não os bloqueia ativamente. No entanto, as opções de compilação do OpenSSL, configurações de distribuição, patches de fornecedor e suites de cifras podem impedir um handshake bem-sucedido.

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

O módulo ssl utiliza heap-types e inicialização multifase.

Foi adicionado um novo sinalizador de verificação VERIFY_X509_PARTIAL_CHAIN.

sys

Adicionar o atributo sys.orig_argv: a lista dos argumentos originais da linha de comandos passados ao executável Python.

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

_thread

_thread.interrupt_main() aceita agora um número de sinal opcional a simular (o padrão continua a ser signal.SIGINT).

Notas