Python 3.9

O Python 3.9.0 (final) foi lançado em 5 de outubro de 2020. Os recursos do 3.9 são definidos na PEP 596 e uma descrição detalhada das mudanças pode ser encontrada em What’s New in Python 3.9

Recursos

Status

PEP 573

Acesso rápido ao estado do módulo a partir de métodos de tipos de extensão C

Não relevante

PEP 584

Operadores de união adicionados ao dict

Completo [1]

PEP 585

Type hinting de genéricos em coleções padrão

PEP 593

Anotações flexíveis de funções e variáveis

PEP 602

O CPython adota um ciclo de lançamento anual. Em vez de anual, busca-se um ciclo de lançamento de dois meses

Não relevante

PEP 614

Restrições gramaticais relaxadas em decoradores

PEP 615

O Banco de Dados de Fusos Horários da IANA agora está presente na biblioteca padrão no módulo zoneinfo

PEP 616

Métodos de string para remover prefixos e sufixos

PEP 617

O CPython agora usa um novo parser baseado em PEG

Não relevante

Outras Mudanças na Linguagem:

__import__() agora levanta ImportError em vez de ValueError

Completo

O Python agora obtém o caminho absoluto do nome do arquivo de script especificado na linha de comando (ex: python3 script.py): o atributo __file__ do módulo __main__ passou a ser um caminho absoluto, em vez de um caminho relativo

Por padrão, para melhor desempenho, o argumento errors é verificado apenas no primeiro erro de codificação/decodificação, e o argumento encoding às vezes é ignorado para strings vazias

“”.replace(“”, s, n) agora retorna s em vez de uma string vazia para todos os n diferentes de zero. Agora é consistente com “”.replace(“”, s)

Qualquer expressão válida agora pode ser usada como decorador. Anteriormente, a gramática era muito mais restritiva

A execução paralela de aclose() / asend() / athrow() agora é proibida, e ag_running agora reflete o status real de execução do gerador assíncrono

Erros inesperados ao chamar o método __iter__ não são mais mascarados por TypeError no operador in e nas funções contains(), indexOf() e countOf() do módulo operator

Expressões lambda sem parênteses não podem mais ser a parte da expressão em uma cláusula if em compreensões e expressões geradoras

Mudanças nos módulos embutidos:

asyncio

Devido a preocupações significativas de segurança, o parâmetro reuse_address de asyncio.loop.create_datagram_endpoint() não é mais suportado

Adicionada uma nova corrotina shutdown_default_executor() que agenda um desligamento para o executor padrão, aguardando o ThreadPoolExecutor terminar de fechar. Além disso, asyncio.run() foi atualizado para usar a nova corrotina.

Adicionado asyncio.PidfdChildWatcher, uma implementação de child watcher específica do Linux que faz polling de descritores de arquivo de processos

adicionada uma nova coroutine asyncio.to_thread()

Ao cancelar a tarefa devido a um timeout, asyncio.wait_for() agora aguardará até que o cancelamento seja concluído também no caso em que o timeout é <= 0, assim como faz com timeouts positivos

asyncio agora levanta TyperError ao chamar métodos incompatíveis com um socket ssl.SSLSocket

gc

A coleta de lixo não bloqueia em objetos ressuscitados

Adicionada uma nova função gc.is_finalized() para verificar se um objeto foi finalizado pelo coletor de lixo

math

Expandida a função math.gcd() para lidar com múltiplos argumentos. Anteriormente, ela suportava apenas dois argumentos

Adicionado math.lcm(): retorna o mínimo múltiplo comum dos argumentos especificados

Adicionado math.nextafter(): retorna o próximo valor de ponto flutuante após x em direção a y

Adicionado math.ulp(): retorna o valor do bit menos significativo de um float

os

Expostos os os.pidfd_open() e os.P_PIDFD específicos do Linux

A função os.unsetenv() agora também está disponível no Windows

Completo

As funções os.putenv() e os.unsetenv() agora estão sempre disponíveis

Completo

Adicionada a função os.waitstatus_to_exitcode(): converte um status de espera em um código de saída

random

Adicionado um novo método random.Random.randbytes: gera bytes aleatórios

sys

Adicionado um novo atributo sys.platlibdir: nome do diretório de biblioteca específico da plataforma

Anteriormente, sys.stderr era bufferizado por bloco quando não interativo. Agora o stderr, por padrão, é sempre bufferizado por linha

Notas