Python 3.8

O Python 3.8.0 (final) foi lançado a 14 de outubro de 2019. As funcionalidades para 3.8 estão definidas em PEP 569 e uma descrição detalhada das alterações pode ser encontrada em What’s New in Python 3.8.

Funcionalidades

Estado

PEP 570

Argumentos exclusivamente posicionais

PEP 572

Expressões de Atribuição

Completo

PEP 574

Protocolo pickle 5 com dados fora de banda

PEP 578

Hooks de auditoria em tempo de execução

PEP 587

Configuração de Inicialização do Python

PEP 590

Vectorcall: um protocolo de chamada rápida para CPython

Diversos

As f-strings suportam = para expressões autodocumentadas e depuração

Completo

Outras Alterações de Linguagem:

Uma instrução continue era ilegal na cláusula finally devido a um problema de implementação. No Python 3.8 esta restrição foi levantada

Completo

Os tipos bool, int e fractions.Fraction têm agora um método as_integer_ratio() semelhante ao encontrado em float e decimal.Decimal

Os construtores de int, float e complex utilizarão agora o método especial __index__(), se disponível e o método correspondente __int__(), __float__() ou __complex__() não estiver disponível

Adicionado suporte a escapes N{name} em expressões regulares

Dict e dictviews são agora iteráveis em ordem de inserção invertida usando reversed()

A sintaxe permitida para nomes de palavras-chave em chamadas de funções foi ainda mais restringida. Em particular, f((keyword)=arg) já não é permitido

O desempacotamento iterável generalizado em instruções yield e return já não requer parênteses circundantes

Quando falta uma vírgula em código como [(10, 20) (30, 40)], o compilador apresenta um SyntaxWarning com uma sugestão útil

As operações aritméticas entre subclasses de datetime.date ou datetime.datetime e objetos datetime.timedelta retornam agora uma instância da subclasse, em vez da classe base

Quando o interpretador Python é interrompido por Ctrl-C (SIGINT) e a exceção KeyboardInterrupt resultante não é capturada, o processo Python sai agora através de um sinal SIGINT ou com o código de saída correto para que o processo chamador possa detetar que terminou devido a um Ctrl-C

Alguns estilos avançados de programação requerem a atualização do objeto types.CodeType de uma função existente

Para inteiros, a forma de três argumentos da função pow() permite agora que o expoente seja negativo no caso em que a base é relativamente prima ao módulo

As compreensões de dict foram sincronizadas com os literais dict de forma a que a chave seja calculada primeiro e o valor em segundo

O método object.__reduce__() pode agora retornar um tuplo de dois a seis elementos

Alterações nos módulos incorporados:

asyncio

asyncio.run() passou da API provisional para a API estável

Completo

Executar python -m asyncio lança um REPL nativamente assíncrono

A exceção asyncio.CancelledError herda agora de BaseException em vez de Exception e já não herda de concurrent.futures.CancelledError

Completo

Adicionado asyncio.Task.get_coro() para obter a corrotina encapsulada dentro de uma asyncio.Task

As tarefas Asyncio podem agora ser nomeadas, passando o argumento de palavra-chave name a asyncio.create_task() ou ao método create_task() do ciclo de eventos, ou chamando o método set_name() no objeto de tarefa

Adicionado suporte a Happy Eyeballs em asyncio.loop.create_connection(). Para especificar o comportamento, foram adicionados dois novos parâmetros: happy_eyeballs_delay e interleave.

gc

get_objects() pode agora receber um parâmetro opcional generation indicando uma geração da qual obter objetos. (Note, porém, que embora gc seja incorporado, get_objects() não está implementado para MicroPython)

math

Adicionada nova função math.dist() para calcular a distância euclidiana entre dois pontos

Expandida a função math.hypot() para suportar múltiplas dimensões

Adicionada nova função math.prod(), como função análoga a sum() que retorna o produto de um valor «inicial» (predefinição: 1) multiplicado por um iterável de números

Adicionadas duas novas funções combinatórias math.perm() e math.comb()

Adicionada nova função math.isqrt() para calcular raízes quadradas inteiras exatas sem conversão para vírgula flutuante

A função math.factorial() já não aceita argumentos que não sejam semelhantes a int

Completo

sys

Adicionada nova função sys.unraisablehook() que pode ser substituída para controlar como são tratadas as «exceções não levantáveis»