Python 3.9

O Python 3.9.0 (final) foi lançado a 5 de outubro de 2020. As funcionalidades para 3.9 estão definidas em PEP 596 e uma descrição detalhada das alterações pode ser encontrada em What’s New in Python 3.9

Funcionalidades

Estado

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

Dicas de tipo genéricas em coleções standard

PEP 593

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

PEP 602

CPython adota um ciclo de lançamento anual. Em vez de anual, o objetivo é um ciclo de lançamento de dois meses

Não relevante

PEP 614

Restrições gramaticais relaxadas nos decoradores

PEP 615

A Base de Dados de Fusos Horários IANA está agora presente na biblioteca standard no módulo zoneinfo

PEP 616

Métodos de string para remover prefixos e sufixos

PEP 617

CPython utiliza agora um novo analisador baseado em PEG

Não relevante

Outras Alterações de Linguagem:

__import__() lança agora ImportError em vez de ValueError

Completo

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

Por predefinição, para melhor desempenho, o argumento errors só é verificado no primeiro erro de codificação/descodificação e o argumento encoding é por vezes ignorado para strings vazias

«».replace(«», s, n) retorna agora s em vez de uma string vazia para todos os n diferentes de zero. É agora consistente com «».replace(«», s)

Qualquer expressão válida pode agora 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 reflete agora o estado de execução real do gerador assíncrono

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

As expressões lambda sem parênteses já não podem ser a parte de expressão numa cláusula if em compreensões e expressões geradoras

Alterações nos módulos incorporados:

asyncio

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

Adicionada uma nova corrotina shutdown_default_executor() que agenda o encerramento do executor predefinido aguardando que o ThreadPoolExecutor termine de fechar. Além disso, asyncio.run() foi atualizado para usar a nova corrotina.

Adicionado asyncio.PidfdChildWatcher, uma implementação de observador de processos filho específica do Linux que monitoriza descritores de ficheiro de processos

adicionada uma nova corrotina asyncio.to_thread()

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

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

gc

A recolha de lixo não bloqueia em objetos ressuscitados

Adicionada 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 suportar múltiplos argumentos. Anteriormente, 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 vírgula flutuante após x em direção a y

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

os

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

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

Completo

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

Completo

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

random

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

sys

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

Anteriormente, sys.stderr era armazenado em buffer de bloco quando não interativo. Agora stderr usa por predefinição sempre armazenamento em buffer de linha

Notas