Esta documentação é de uma versão antiga do Python que não é mais atualizada. Você deveria atualizar e ler a Documentação do Python para versão estável atual.

# O que há de novo no Python 3.9

Versão

  3.9.25

Data

  abril 03, 2026

Editor

  Łukasz Langa

Esse artigo explica os novos recursos no Python 3.9, comparado ao 3.8. O Python 3.9 foi lançado em 5 de outubro de 2020.

Para detalhes completos, veja o changelog.

Ver também

PEP 596 - Python 3.9 Release Schedule

## Resumo – Destaques da versão

Novos recursos de sintaxe:

- PEP 584, operadores de união adicionados ao `dict`;

- PEP 585, type hinting genéricos em coleções comuns;

- PEP 614, restrições de gramática relaxadas em decoradores.

Novos recursos embutidos:

- PEP 616, métodos de strings para remover prefixos e sufixos.

Novos recursos na biblioteca padrão:

- PEP 593, anotações flexíveis de função e variável;

- `os.pidfd_open()` adicionada para permitidos gerenciamento de processo sem corridas e sinais.

Melhorias no interpretador:

- PEP 573, acesso rápido ao estado do módulo a partir de métodos de tipos de extensão C;

- PEP 617, CPython agora usa um novo analisador sintático com base em GASE;

- vários tipos embutidos do Python (range, tuple, set, frozenset, list, dict) estão agora mais rápidos usando vectorcall da PEP 590;

- coleta de lixo não causa bloqueio em objetos ressuscitados;

- vários módulos do Python (`_abc`, `audioop`, `_bz2`, `_codecs`, `_contextvars`, `_crypt`, `_functools`, `_json`, `_locale`, `math`, `operator`, `resource`, `time`, `_weakref`) agora usam inicialização multifásica conforme definido pela PEP 489;

- vários módulos da biblioteca padrão (`audioop`, `ast`, `grp`, `_hashlib`, `pwd`, `_posixsubprocess`, `random`, `select`, `struct`, `termios`, `zlib`) estão agora usando a ABI estável definida pela PEP 384.

Novos módulos de biblioteca:

- PEP 615, o banco de dados de fusos horários da IANA é agora apresentado na biblioteca padrão no módulo `zoneinfo`;

- uma implementação de um tipo topológico de um grafo agora é fornecida no novo módulo `graphlib`.

Alterações no processo de lançamento:

- PEP 602, CPython adota um ciclo de lançamento anual.

## Você deve verificar DeprecationWarning no seu código

Quando o Python 2.7 ainda tinha suporte, muitas funcionalidades do Python 3 foram mantidas para compatibilidade com versões anteriores do Python 2.7. Com o fim do suporte ao Python 2, essas camadas de compatibilidade com versões anteriores foram removidas ou serão removidas em breve. A maioria deles emitia um aviso de `DeprecationWarning` por vários anos. Por exemplo, usar `collections.Mapping` em vez de `collections.abc.Mapping` emite uma `DeprecationWarning` desde Python 3.3, lançado em 2012.

Teste sua aplicação com a opção de linha de comando `-W` `default` para ver `DeprecationWarning` e `PendingDeprecationWarning`, ou mesmo com `-W` `error` para tratá-los como erros. Filtro de avisos pode ser usado para ignorar avisos de código de terceiros.

Python 3.9 é a última versão que fornece essas camadas de compatibilidade com versões anteriores do Python 2, para dar mais tempo aos mantenedores de projetos Python para organizar a remoção do suporte Python 2 e adicionar suporte para Python 3.9.

Aliases para classes bases abstratas no módulo `collections`, como o alias `collections.Mapping` para `collections.abc.Mapping`, são mantidos para uma última versão para compatibilidade reversa. Eles serão removidos do Python 3.10.

De maneira mais geral, experimente executar seus testes no Modo de Desenvolvimento do Python, que ajuda a preparar seu código para torná-lo compatível com a próxima versão do Python.

Observação: vários itens descontinuados pré-existentes também foram removidos nesta versão do Python. Consulte a seção Removidos.

## Novas funcionalidades

### Operadores de mesclagem & atualização de dicionário

Operadores de mesclagem (`|`) e atualização (`|=`) foram adicionados à classe embutida `dict`. Eles complementam o métodos `dict.update` e `{**d1, **d2}` existentes de mesclagem de dicionários.

Exemplo:

    >>> x = {"key1": "value1 from x", "key2": "value2 from x"}
    >>> y = {"key2": "value2 from y", "key3": "value3 from y"}
    >>> x | y
    {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
    >>> y | x
    {'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

Veja PEP 584 para uma descrição completa. (Contribuição de Brandt Bucher em bpo-36144.)

### Novos métodos de strings para remover prefixos e sufixos

`str.removeprefix(prefix)` e `str.removesuffix(suffix)` foram adicionados para remover facilmente um prefixo ou sufixo desnecessário de uma string. Os métodos correspondentes `bytes`, `bytearray` e `collections.UserString` também foram adicionados. Veja PEP 616 para uma descrição completa. (Contribuição de Dennis Sweeney em bpo-39939.)

### Type hinting genéricos nas coleções padrão

Agora, nas anotações de tipo, você pode usar tipos de coleção embutidos como `list` e `dict` como tipos genéricos, em vez de importar os tipos de letras maiúsculas correspondentes (por exemplo, `List` ou `Dict`) de `typing`. Agora, outros tipos na biblioteca padrão também são genéricos, por exemplo, `queue.Queue`.

Exemplo:

    def greet_all(names: list[str]) -> None:
        for name in names:
            print("Hello", name)

Consulte PEP 585 para mais detalhes. (Contribuição de Guido van Rossum, Ethan Smith e Batuhan Taşkaya em bpo-39481.)

### Novo analisador sintático

O Python 3.9 usa um novo analisador sintático, baseado em GASE em vez de LL(1). O desempenho do novo analisador sintático é aproximadamente comparável ao do analisador sintático antigo, mas o formalismo do GASE é mais flexível que do LL(1) quando se trata de projetar novos recursos de linguagem. Começaremos a usar essa flexibilidade no Python 3.10 e posterior.

O módulo `ast` usa o novo analisador e produz o mesmo AST que o analisador antigo.

No Python 3.10, o analisador antigo será excluído e todas as funcionalidades que dependem dele (principalmente o módulo `parser`, que foi descontinuado a muito tempo). No Python 3.9 apenas, você pode voltar ao analisador LL(1) usando uma opção de linha de comando (`-X oldparser`) ou uma variável de ambiente (`PYTHONOLDPARSER=1`).

Consulte PEP 617 para mais detalhes. (Contribuição de Guido van Rossum, Pablo Galindo e Lysandros Nikolaou em bpo-40334.)

## Outras mudanças na linguagem

- `__import__()` agora levanta `ImportError` em vez de `ValueError`, o que é usado para ocorrer quando uma importação relativa passou de seu um pacote de nível superior. (Contribuição de Ngalim Siregar em bpo-37444.)

- Agora, o Python obtém o caminho absoluto do nome do arquivo do script especificado na linha de comando (p.ex., `python3 script.py`): o atributo `__file__` do módulo `__main__` tornou-se um caminho absoluto, não um caminho relativo. Esses caminhos agora permanecem válidos depois que o diretório atual é alterado por `os.chdir()`. Como efeito colateral, o traceback também exibe o caminho absoluto para quadros de módulos de `__main__` neste caso. (Contribuição de Victor Stinner em bpo-20443.)

- No Modo de Desenvolvimento do Python e na compilação de depuração, os argumentos encoding e errors agora são verificados quanto às operações de codificação e decodificação de strings. Exemplos: `open()`, `str.encode()` e `bytes.decode()`.

  Por padrão, para obter o 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. (Contribuição de Victor Stinner em bpo-37388.)

- `"".replace("", s, n)` agora retorna `s` em vez de uma string vazia para todos `n` não zero. Isso é agora consistente com `"".replace("", s)`. Há alterações similares para objetos `bytes` e `bytearray`. (Contribuição de Serhiy Storchaka em bpo-28029.)

- Qualquer expressão válida agora pode ser usada como decorador. Anteriormente, a gramática era muito mais restritiva. Veja PEP 614 para detalhes. (Contribuição de Brandt Bucher em bpo-39702.)

- Aprimorada a ajuda para o módulo `digitando`. Agora, as linhas de documento são mostradas para todos os formulários especiais e aliases genéricos especiais (como `Union` e `List`). Usando `help()` com alias genérico como `List[int]` mostrará a ajuda para o tipo concreto correspondente (neste caso, `list`). (Contribuição de Serhiy Storchaka em bpo-40257.)

- A execução paralela de `aclose()` / `asend()` / `athrow()` é agora proibida e `ag_running` agora reflete o status atual de execução do gerador async. (Contribuição de Yury Selivanov em bpo-30773.)

- 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`. (Contribuição de Serhiy Storchaka em bpo-40824.)

- 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. Veja bpo-41848 e bpo-43755 para detalhes.

## Novos módulos

### zoneinfo

O módulo `zoneinfo` oferece suporte ao banco de dados de fuso horário da IANA para a biblioteca padrão. Ele adiciona `zoneinfo.ZoneInfo`, uma implementação concreta `datetime.tzinfo`, apoiada pelos dados do fuso horário do sistema.

Exemplo:

    >>> from zoneinfo import ZoneInfo
    >>> from datetime import datetime, timedelta

    >>> # Daylight saving time
    >>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
    >>> print(dt)
    2020-10-31 12:00:00-07:00
    >>> dt.tzname()
    'PDT'

    >>> # Standard time
    >>> dt += timedelta(days=7)
    >>> print(dt)
    2020-11-07 12:00:00-08:00
    >>> print(dt.tzname())
    PST

Como fonte alternativa de dados para plataformas que não entregam o banco de dados da IANA, o módulo `tzdata` foi lançado como um pacote inicial – distribuído via PyPI e mantido pela equipe principal do CPython.

Ver também

PEP 615 – Suporte ao banco de dados de fuso horário da IANA na biblioteca padrão

  PEP escrita e implementada por Paul Ganssle

### graphlib

Um novo módulo, `graphlib`, foi adicionado contendo a classe `graphlib.TopologicalSorter` para oferecer funcionalidade de realizar classificação topológica de grafos. (Contribuição de Pablo Galindo, Tim Peters e Larry Hastings em bpo-17005.)

## Módulos melhorados

### ast

Adicionada a opção indent a `dump()`, que permite produzir uma saída indentada com várias linhas. (Contribuição de Serhiy Storchaka em bpo-37995.)

Adicionada `ast.unparse()` como uma função no módulo `ast` que pode ser usado para remover um objeto `ast.AST` e produzir uma string com código que produziria um objeto `ast.AST` equivalente quando analisado. (Contribuição de Pablo Galindo e Batuhan Taskaya em bpo-38870.)

Adicionadas docstrings aos nós AST que contêm a assinatura ASDL usada para construir esse nó. (Contribuição de Batuhan Taskaya em bpo-39638.)

### asyncio

Devido a significativas preocupações de segurança, o parâmetro reuse_address de `asyncio.loop.create_datagram_endpoint()` não é mais suportado. Isso ocorre devido ao comportamento da opção de soquete `SO_REUSEADDR` no UDP. Para mais detalhes, consulte a documentação de `loop.create_datagram_endpoint()`. (Contribuição de Kyle Stanley, Antoine Pitrou e Yury Selivanov em bpo-37228.)

Adicionada uma nova corrotina `shutdown_default_executor()` que agenda um desligamento para o executor padrão que espera na `ThreadPoolExecutor` para concluir o fechamento. Além disso, `asyncio.run()` foi atualizada para usar o novo corrotina. (Contribuição de Kyle Stanley em bpo-34037.)

Adicionada `asyncio.PidfdChildWatcher`, uma implementação de monitorador de filhos específica do Linux que controla descritores de arquivo de processo. (bpo-38692)

Adicionada uma nova corrotina `asyncio.to_thread()`. É usada principalmente para executar funções vinculadas à E/S em uma thread separada para evitar o bloqueio do loop de eventos e funciona essencialmente como uma versão de alto nível de `run_in_executor()` que pode receber argumentos nomeados diretamente. (Contribuição de Kyle Stanley e Yury Selivanov em bpo-32309.)

Ao cancelar a tarefa devido a um tempo limite, `asyncio.wait_for()` irá agora esperar até que o cancelamento seja concluído também no caso quando timeout é <= 0, como acontece com tempos limite positivos. (Contribuição de Elvis Pranskevichus em bpo-32751.)

`asyncio` agora levanta `TyperError` ao chamar métodos incompatíveis com um soquete `ssl.SSLSocket`. (Contribuição de Ido Michael em bpo-37404.)

### compileall

Adicionada nova possibilidade de usar hardlinks para arquivos `.pyc` duplicados: parâmetro hardlink_dupes e opção de linha de comando –hardlink-dupes. (Contribuição de Lumír ‘Frenzy’ Balhar em bpo-40495.)

Adicionadas novas opções para manipulação de caminho nos arquivos `.pyc` resultantes: parâmetros stripdir, prependdir, limit_sl_dest e opções de linha de comando -s, -p, -e. Foi adicionada a possibilidade de especificar a opção para um nível de otimização várias vezes. (Contribuição de Lumír ‘Frenzy’ Balhar em bpo-38112.)

### concurrent.futures

Adicionado um novo parâmetro cancel_futures em `concurrent.futures.Executor.shutdown()` que cancela todos os futuros pendentes que ainda não começaram a ser executados, em vez de esperar que eles sejam concluídos antes de desligar o executor. (Contribuição de Kyle Stanley em bpo-39349.)

Removidos as threads do daemon de `ThreadPoolExecutor` e `ProcessPoolExecutor`. Isso melhora a compatibilidade com subinterpretadores e a previsibilidade em seus processos de desligamento. (Contribuição de Kyle Stanley em bpo-39812.)

Workers em `ProcessPoolExecutor` agora são gerados sob demanda, apenas quando não há workers ociosos disponíveis para reutilização. Isso otimiza a sobrecarga da inicialização e reduz a quantidade de tempo perdido da CPU para os workers ociosos. (Contribuição de Kyle Stanley em bpo-39207.)

### curses

Adicionadas as funções `curses.get_escdelay()`, `curses.set_escdelay()`, `curses.get_tabsize()` e `curses.set_tabsize()`. (Contribuição de Anthony Sottile em bpo-38312.)

### datetime

Os métodos `isocalendar()` de `datetime.date` e `isocalendar()` de `datetime.datetime` agora retornam uma `namedtuple()` em vez de uma `tuple`. (Contribuição de Dong-hee Na em bpo-24416.)

### distutils

O comando upload agora cria digests de hash SHA2-256 e Blake2b-256. Ele pula o MD5 em plataformas que bloqueiam digest do MD5. (Contribuição de Christian Heimes em bpo-40698.)

### fcntl

Adicionadas as constantes `F_OFD_GETLK`, `F_OFD_SETLK` e `F_OFD_SETLKW`. (Contribuição de Dong-hee Na em bpo-38602.)

### ftplib

`FTP` e `FTP_TLS` agora levantam a `ValueError` se o tempo limite especificado para o construtor for zero para impedir a criação de um soquete não-bloqueante. (Contribuição de Dong-hee Na em bpo-39259.)

### gc

Quando o coletor de lixo faz uma coleção na qual alguns objetos ressuscitam (são alcançáveis fora dos ciclos isolados após a execução dos finalizadores), não bloqueia a coleção de todos os objetos que ainda estão inacessíveis. (Contribuição de Pablo Galindo e Tim Peters em bpo-38379.)

Adicionada uma nova função `gc.is_finalized()` para verificar se um objeto foi finalizado pelo coletor de lixo. (Contribuição de Pablo Galindo em bpo-39322.)

### hashlib

O módulo `hashlib` pode agora usar hashes SHA3 e SHAKE XOF de OpenSSL quando disponível. (Contribuição de Christian Heimes em bpo-37630.)

Os módulos hash integrados agora podem ser desativados com `./configure --without-builtin-hashlib-hashes` ou ativados seletivamente com por exemplo `./configure --with-builtin-hashlib-hashes=sha3,blake2` para forçar o uso da implementação baseada em OpenSSL. (Contribuição de Christian Heimes em bpo-40479)

### http

Códigos de status HTTP `103 EARLY_HINTS`, `418 IM_A_TEAPOT` e `425 TOO_EARLY` foram adicionados a `http.HTTPStatus`. (Contribuição de Dong-hee Na em bpo-39509 e Ross Rhodes em bpo-39507.)

### IDLE e idlelib

Adicionada a opção para ativar e desativar o piscar do cursor. (Contribuição de Zackery Spytz na bpo-4603.)

A tecla Escape agora fecha as janelas de conclusão IDLE. (Contribuição de Johnny Najera em bpo-38944.)

Adicionada argumentos nomeados à lista de completamento de nome de módulo. (Contribuição de Terry J. Reedy em bpo-37765.)

Novo nas versões de manutenção 3.9.

Faz o IDLE invocar `sys.excepthook()` (quando iniciado sem ‘-n’). Ganchos de usuário eram ignorados anteriormente. (Contribuição de Ken Hilton em bpo-43008.)

As alterações acima foram portadas para versões de manutenção do 3.8.

Reorganiza a caixa de diálogo de configurações. Divide a aba General nas abas Windows e Shell/Ed. Move as fontes de ajuda, que estendem o menu Help, para a aba Extensions. Abre espaço para novas opções e encurta a caixa de diálogo. O último faz com que o diálogo se ajuste melhor a telas pequenas. (Contribuição de Terry Jan Reedy em bpo-40468.) Move a configuração do espaço de recuo da aba Font para a nova aba Windows. (Contribuição de Mark Roseman e Terry Jan Reedy em bpo-33962.)

Aplica realce de sintaxe em arquivos .pyi. (Contribuição de Alex Waygood e Terry Jan Reedy em bpo-45447.)

### imaplib

`IMAP4` e `IMAP4_SSL` agora possuem o parâmetro opcional timeout para seus construtores. Também, o método `open()` agora possui um parâmetro opcional timeout com esta alteração. Os métodos substituídos de `IMAP4_SSL` e `IMAP4_stream` foram aplicados nesta alteração. (Contribuição de Dong-hee Na em bpo-38615.)

`imaplib.IMAP4.unselect()` foi adicionado. `imaplib.IMAP4.unselect()` libera os recursos do servidor associados à caixa de correio selecionada e retorna o servidor ao estado autenticado. Este comando executa as mesmas ações que `imaplib.IMAP4.close()`, exceto que nenhuma mensagem é removida permanentemente da caixa de correio selecionada no momento. (Contribuição de Dong-hee Na em bpo-40375.)

### importlib

Para melhorar a consistência com as instruções de importação, `importlib.util.resolve_name()` agora levanta `ImportError` em vez de `ValueError` para tentativas de importação relativas inválidas. (Contribuição de Ngalim Siregar em bpo-37444.)

Carregadores de importação que publicam objetos de módulo imutáveis agora podem publicar pacotes imutáveis além de módulos individuais. (Contribuição de Dino Viehland em bpo-39336.)

Adicionada a função `importlib.resources.files()` com suporte a subdiretórios nos dados do pacote, correspondendo ao backport na versão 1.5 do `importlib_resources`. (Contribuição de Jason R. Coombs em bpo-39791.)

Renovado `importlib.metadata` de `importlib_metadata` versão 1.6.1.

### inspect

`inspect.BoundArguments.arguments` foi alterado de `OrderedDict` para dict regular. (Contribuição de Inada Naoki em bpo-36350 e bpo-39775.)

### ipaddress

`ipaddress` agora suporta endereços IPv6 com escopo definido (endereço IPv6 com sufixo `%<scope_id>`).

Os endereços IPv6 com escopo definido podem ser analisados usando `ipaddress.IPv6Address`. Se presente, o ID da zona de escopo está disponível através do atributo `scope_id`. (Contribuição de Oleksandr Pavliuk em bpo-34788.)

A partir do Python 3.9.5, o módulo `ipaddress` não aceita mais zeros à esquerda em strings de endereço IPv4. (Contribuição de Christian Heimes em bpo-36384).

### math

Expandida a função `math.gcd()` para manipular vários argumentos. Anteriormente, tinha suporte apenas a dois argumentos. (Contribuição de Serhiy Storchaka em bpo-39648.)

Adicionada `math.lcm()`: retorna o menor múltiplo comum dos argumentos especificados. (Contribuição de Mark Dickinson, Ananthakrishnan e Serhiy Storchaka em bpo-39479 e :issue:` 39648`.)

Adicionada `math.nextafter()`: retorna o próximo valor de ponto flutuante após x em direção a y. (Contribuição de Victor Stinner em bpo-39288.)

Adicionada `math.ulp()`: retorna o valor do bit menos significativo de um ponto flutuante. (Contribuição de Victor Stinner em bpo-39310.)

### multiprocessing

A classe `multiprocessing.SimpleQueue` tem um novo método `close()` para fechar explicitamente a fila. (Contribuição de Victor Stinner em bpo-30966.)

### nntplib

`NNTP` e `NNTP_SSL` agora levantam uma exceção `ValueError` se o tempo limite fornecido ao construtor é zero, para prevenir a criação de um socket não-bloqueante. (Contribuição de Dong-hee Na em bpo-39259.)

### os

Adicionadas as constantes `CLD_KILLED` e `CLD_STOPPED` para `si_code`. (Contribuição de Dong-hee Na em bpo-38493.)

Exposta `os.pidfd_open()` específica do Linux (bpo-38692) e `os.P_PIDFD` (bpo-38713) para gerenciamento de processos com descritores de arquivo.

A função `os.unsetenv()` agora também está disponível no Windows. (Contribuição de Victor Stinner em bpo-39413.)

As funções `os.putenv()` e `os.unsetenv()` estão agora sempre disponíveis. (Contribuição de Victor Stinner em bpo-39395.)

Adicionada a função `os.waitstatus_to_exitcode()`: converte um status de espera em um código de saída. (Contribuição de Victor Stinner em bpo-40094.)

As of 3.9.20, `os.mkdir()` and `os.makedirs()` on Windows now support passing a mode value of `0o700` to apply access control to the new directory. This implicitly affects `tempfile.mkdtemp()` and is a mitigation for CVE-2024-4030. Other values for mode continue to be ignored. (Contributed by Steve Dower in gh-118486.)

### pathlib

Adicionado `pathlib.Path.readlink ()`, que age de maneira semelhante a `os.readlink()`. (Contribuição de Girts Folkmanis em :issue: 30618)

### pdb

No Windows, agora `Pdb` tem suporte a `~/.pdbrc`. (Contribuição de Tim Hopper e Dan Lidral-Porter em bpo-20523.)

### poplib

`POP3` e `POP3_SSL` agora levantam a `ValueError` se o tempo limite especificado para o construtor for zero para impedir a criação de um soquete sem bloqueio. (Contribuição de Dong-hee Na em bpo-39259.)

### pprint

`pprint` agora pode imprimir `types.SimpleNamespace`. (Contribuição de Carl Bordum Hansen em bpo-37376.)

### pydoc

A string de documentação agora é mostrada não apenas para classe, função, método etc, mas para qualquer objeto que tenha seu próprio atributo `__doc__`. (Contribuição de Serhiy Storchaka em bpo-40257.)

### random

Adicionado um novo método `random.Random.randbytes`: gera bytes aleatórios. (Contribuição de Victor Stinner em bpo-40286.)

### signal

Exposta a `signal.pidfd_send_signal()` específica do Linux para enviar sinais a um processo usando um descritor de arquivo em vez de um pid. (bpo-38712)

### smtplib

`SMTP` e `SMTP_SSL` agora levantam uma `ValueError` se o tempo limite especificado para seu construtor for zero para impedir a criação de um soquete sem bloqueio. (Contribuição de Dong-hee Na em bpo-39259.)

O construtor de `LMTP` agora tem um parâmetro opcional timeout. (Contribuição de Dong-hee Na em bpo-39329.)

### socket

O módulo `socket` agora exporta a constante `CAN_RAW_JOIN_FILTERS` no Linux 4.1 e superior. (Contribuição de Stefan Tatschner e Zackery Spytz em bpo-25780.)

O módulo socket agora suporta o protocolo `CAN_J1939` nas plataformas que o suportam. (Contribuição de Karl Ding em bpo-40291.)

O módulo socket agora tem as funções `socket.send_fds()` e `socket.recv_fds()`. (Contribuição de Joannah Nanjekye, Shinya Okano e Victor Stinner em bpo-28724.)

### time

No AIX, `thread_time()` agora é implementado com `thread_cputime()` que possui resolução de nanossegundos, em vez de `clock_gettime(CLOCK_THREAD_CPUTIME_ID)`, que tem uma resolução de 10 ms. (Contribuição de Batuhan Taskaya em bpo-40192)

### sys

Adicionado um novo atributo `sys.platlibdir`: nome do diretório da biblioteca específica da plataforma. É usado para construir o caminho da biblioteca padrão e os caminhos dos módulos de extensão instalados. É igual a `"lib"` na maioria das plataformas. No Fedora e SuSE, é igual a `"lib64"` nas plataformas de 64 bits. (Contribuição de Jan Matějek, Matěj Cepl, Charalampos Stratakis e Victor Stinner em bpo-1294959.)

Anteriormente, `sys.stderr` era armazenado em buffer quando não interativo. Agora, `stderr` assume como padrão sempre o buffer de linha. (Contribuição de Jendrik Seipp em bpo-13601.)

### tempfile

As of 3.9.20 on Windows, the default mode `0o700` used by `tempfile.mkdtemp()` now limits access to the new directory due to changes to `os.mkdir()`. This is a mitigation for CVE-2024-4030. (Contributed by Steve Dower in gh-118486.)

### tracemalloc

Adicionada `tracemalloc.reset_peak()` para definir o tamanho do pico dos blocos de memória rastreados para o tamanho atual, para medir o pico de partes específicas do código. (Contribuição de Huon Wilson em bpo-40630.)

### typing

PEP 593 introduziu um tipo `typing.Annotated` para decorar tipos existentes com metadados específicos de contexto e o novo parâmetro `include_extras` para `typing.get_type_hints()` para acessar os metadados em tempo de execução. (Contribuição de Till Varoquaux e Konstantin Kashin.)

### unicodedata

O banco de dados Unicode foi atualizado para a versão 13.0.0. (bpo-39926).

### venv

Os scripts de ativação fornecidos por `venv` agora especificam sua personalização de prompt de forma consistente, sempre usando o valor especificado por `__VENV_PROMPT__`. Anteriormente, alguns scripts usavam incondicionalmente `__VENV_PROMPT__`, outros apenas se fosse definido (que era o caso padrão) e um usava `__VENV_NAME__`. (Contribuição de Brett Cannon em bpo-37663.)

### xml

Os caracteres de espaço em branco nos atributos agora são preservados ao serializar `xml.etree.ElementTree` para o arquivo XML. EOLNs não são mais normalizados para “n”. Este é o resultado da discussão sobre como interpretar a seção 2.11 da especificação XML. (Contribuição de Mefistotelis em bpo-39011.)

## Otimizações

- Otimizado o idioma para atribuição de uma variável temporária nas compreensões. Agora `for y in [expr]` nas compreensões é tão rápido quanto uma atribuição simples `y = expr`. Por exemplo:

  > sums = [s for s in [0] for x in data for s in [s + x]]

  Ao contrário do operador `:=`, este idioma não vaza uma variável para o escopo externo.

  (Contribuição de Serhiy Storchaka em bpo-32856.)

- Otimizada a manipulação de sinais em aplicações multithread. Se uma thread diferente da thread principal obtiver um sinal, o loop de avaliação do bytecode não será mais interrompido a cada instrução de bytecode para verificar se há sinais pendentes que não podem ser manipulados. Somente o segmento principal do interpretador principal pode manipular sinais.

  Anteriormente, o loop de avaliação do bytecode era interrompido em cada instrução até que a thread principal lidasse com os sinais. (Contribuição de Victor Stinner em bpo-40010.)

- Otimizado o módulo `subprocess` no FreeBSD usando `closefrom()`. (Contribuição de Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak e Victor Stinner em bpo-38061.)

- `PyLong_FromDouble()` está agora até 1.87x mais rápido para valores que cabem em um `long`. (Contribuição de Sergey Fedoseev em bpo-37986.)

- Vários componentes embutidos do Python (`range`, `tuple`, `set`, `frozenset`, `list`, `dict`) agora são acelerados usando o protocolo vectorcall da PEP 590. (Contribuição de Dong-hee Na, Mark Shannon, Jeroen Demeyer e Petr Viktorin em bpo-37207.)

- Otimizada a `difference_update()` para o caso em que o outro conjunto é muito maior do que o conjunto base. (Sugestão de Evgeny Kapun com contribuição de código de Michele Orrù em bpo-8425.)

- O alocador de pequenos objetos do Python (`obmalloc.c`) agora permite (não mais que) uma arena vazia para permanecer disponível para reutilização imediata, sem retorná-la ao sistema operacional. Isso evita o desperdiçar loops simples, onde uma arena pode ser criada e destruída novamente em cada iteração. (Contribuição de Tim Peters em bpo-37257.)

- divisão pelo piso de operação flutuante agora tem um melhor desempenho. Além disso, a mensagem de `ZeroDivisionError` para esta operação foi atualizada. (Contribuição de Dong-hee Na em bpo-39434.)

- A decodificação de strings curtas ASCII com codecs UTF-8 e ascii é agora cerca de 15% mais rápida. (Contribuição de Inada Naoki em bpo-37348.)

Aqui está um resumo das melhorias de desempenho do Python 3.4 ao Python 3.9:

    Python version                       3.4     3.5     3.6     3.7     3.8    3.9
    --------------                       ---     ---     ---     ---     ---    ---

    Variable and attribute read access:
        read_local                       7.1     7.1     5.4     5.1     3.9    3.9
        read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
        read_global                     15.5    19.0    14.3    13.6     7.6    7.8
        read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
        read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
        read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
        read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
        read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
        read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
        read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

    Variable and attribute write access:
        write_local                      8.7     9.3     5.5     5.3     4.3    4.3
        write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
        write_global                    19.7    21.2    18.0    18.0    15.8   16.7
        write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
        write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
        write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

    Data structure read access:
        read_list                       24.2    24.5    20.8    20.8    19.0   19.5
        read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
        read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
        read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

    Data structure write access:
        write_list                      27.1    28.5    22.5    21.6    20.0   20.0
        write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
        write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
        write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

    Stack (or queue) operations:
        list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
        deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
        deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

    Timing loop:
        loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

Estes resultados foram gerados a partir do script de benchmark de acesso variável em: `Tools/scripts/var_access_benchmark.py`. O script de benchmark exibe tempos em nanossegundos. Os benchmarks foram medidos em um processador Intel® Core ™ i7-4960HQ executando as compilações do macOS de 64 bits encontradas em python.org.

## Descontinuados

- O comando `bdist_msi` do distutils está agora descontinuado, use `bdist_wheel` (pacotes wheel). (Contribuição de Hugo van Kemenade em bpo-39586.)

- Atualmente `math.factorial()` aceita instâncias da `float` com valores inteiros não negativos (como `5.0`). Ela levanta uma `ValueError` para flutuadores não integrais e negativos. Agora está descontinuado. Nas versões futuras do Python, será levantada uma `TypeError` para todos os flutuadores. (Contribuição de Serhiy Storchaka em bpo-37315.)

- Os módulos `parser` e `symbol` foram descontinuados e serão removidos em versões futuras do Python. Para a maioria dos casos de uso, os usuários podem aproveitar o estágio de geração e compilação da Árvores de Sintaxe Abstrata (AST), usando o módulo `ast`.

- As funções públicas de API C `PyParser_SimpleParseStringFlags()`, `PyParser_SimpleParseStringFlagsFilename()`, `PyParser_SimpleParseFileFlags()` e `PyNode_Compile()` foram descontinuados e serão removidos no Python 3.10 junto com o analisador sintático antigo.

- O uso de `NotImplemented` em um contexto booleano foi descontinuado, pois é quase exclusivamente o resultado de implementações incorretas de comparadores avançados. Isso será tornado em uma `TypeError` em uma versão futura do Python. (Contribuição de Josh Rosenberg em bpo-35712.)

- O módulo `random` atualmente aceita qualquer tipo hasheável como um possível valor inicial. Infelizmente, alguns desses tipos não têm garantia de ter um valor de hash determinístico. Após o Python 3.9, o módulo restringirá suas sementes a `None`, `int`, `float`, `str`, `bytes` e `bytearray`.

- A abertura do arquivo `GzipFile` para escrita sem especificar o argumento mode foi descontinuado. Nas versões futuras do Python, ele sempre será aberto para leitura por padrão. Especifique o argumento mode para abri-lo para escrever e silenciar um aviso. (Contribuição de Serhiy Storchaka em bpo-28286.)

- Descontinuado o método `split()` de `_tkinter.TkappType` a favor do método `splitlist()` que possui um comportamento mais consistente e previsível. (Contribuição de Serhiy Storchaka em bpo-38371.)

- A passagem explícita dos objetos da corrotina para `asyncio.wait()` foi descontinuada e será removida na versão 3.11. (Contribuição de Yury Selivanov e Kyle Stanley em bpo-34790.)

- Os padrões binhex4 e hexbin4 agora estão obsoletos. O módulo `binhex` e as seguintes funções `binascii` foram descontinuadas:

  - `b2a_hqx()`, `a2b_hqx()`

  - `rlecode_hqx()`, `rledecode_hqx()`

  (Contribuição de Victor Stinner em bpo-39353.)

- As classes `slice`, `Index` e `ExtSlice` de `ast` são consideradas descontinuadas e serão removidas nas versões futuras do Python. O próprio `value` deve ser usado em vez de `Index(value)`. `Tuple(slices, Load())` deve ser usada em vez de `ExtSlice(slices)`. (Contribuição de Serhiy Storchaka em bpo-34822.)

- As classes `Suite`, `Param`, `AugLoad` e `AugStore` de `ast` são consideradas descontinuadas e serão removidas nas versões futuras do Python. Elas não foram geradas pelo analisador sintático e não foram aceitos pelo gerador de código no Python 3. (Contribuição de Batuhan Taskaya em bpo-39639 e bpo-39969 e Serhiy Storchaka em bpo-39988.)

- As funções `PyEval_InitThreads()` e `PyEval_ThreadsInitialized()` agora estão descontinuadas e serão removidas no Python 3.11. Chamar `PyEval_InitThreads()` agora não faz nada. O GIL é inicializado por `Py_Initialize()` desde o Python 3.7. (Contribuição de Victor Stinner em bpo-39877.)

- Passar `None` como o primeiro argumento para a função `shlex.split()` foi descontinuada. (Contribuição de Zackery Spytz em bpo-33262.)

- `smtpd.MailmanProxy()` está agora descontinuado, pois está inutilizável sem um módulo externo, `mailman`. (Contribuição de Samuel Colvin em bpo-35800.)

- O módulo `lib2to3` agora emite um `PendingDeprecationWarning`. Python 3.9 mudou para um analisador sintático GASE (veja PEP 617) e Python 3.10 pode incluir uma nova sintaxe de linguagem que não é analisável pelo analisador sintático LL(1) de lib2to3. O módulo `lib2to3` pode ser removido da biblioteca padrão em uma versão futura do Python. Considere alternativas de terceiros, como LibCST ou parso. (Contribuição de Carl Meyer em bpo-40360.)

- Adicionado o parâmetro random da `random.shuffle()` foi descontinuado. (Contribuição de Raymond Hettinger em bpo-40465)

## Removidos

- A versão errônea em `unittest.mock.__version__` foi removida.

- `nntplib.NNTP`: os métodos `xpath()` e `xgtitle()` foram removidos. Esses métodos foram descontinuados desde Python 3.3. Geralmente, essas extensões não são suportadas ou não são habilitadas pelos administradores do servidor NNTP. Para `xgtitle()`, use `nntplib.NNTP.descriptions()` ou `nntplib.NNTP.description()`. (Contribuição de Dong-hee Na em bpo-39366.)

- `array.array`: os métodos `tostring()` e `fromstring()` foram removidos. Eles eram aliases para `tobytes()` e `frombytes()`, descontinuado desde Python 3.2. (Contribuição de Victor Stinner em bpo-38916.)

- A função `sys.callstats()` não documentada foi removida. Desde o Python 3.7, ela foi descontinuada e sempre retornou `None`. É necessária uma opção de compilação especial `CALL_PROFILE` que já foi removida no Python 3.7. (Contribuição de Victor Stinner em bpo-37414.)

- As funções `sys.getcheckinterval()` e `sys.setcheckinterval()` foram removidas. Elas foram descontinuadas desde o Python 3.2. Use `sys.getswitchinterval()` e `sys.setswitchinterval()` em seu lugar. (Contribuição de Victor Stinner em bpo-37392.)

- A função C `PyImport_Cleanup()` foi removida. Foi documentada como: “Esvazia a tabela do módulo. Apenas para uso interno.” (Contribuição de Victor Stinner em bpo-36710.)

- Os módulos `_dummy_thread` e `dummy_threading` foram removidos. Esses módulos foram descontinuados desde o Python 3.7, que requer suporte a threading. (Contribuição de Victor Stinner em bpo-37312.)

- `aifc.openfp()` alias para `aifc.open()`, `sunau.openfp()` alias para `sunau.open()` e `wave.openfp()` alias para `wave.open()` foi removido. Eles foram descontinuados desde o Python 3.7. (Contribuição de Victor Stinner em bpo-37320.)

- O método `isAlive()` de `threading.Thread` foi removido. Ele foi descontinuado desde o Python 3.8. Use `is_alive()` ao invés. (Contribuição de Dong-hee Na em bpo-37804.)

- Os métodos `getchildren()` e `getiterator()` das classes `ElementTree` e `Element` no módulo `ElementTree` foram removidos. Eles foram descontinuados no Python 3.2. Use `iter(x)` ou `list(x)` em vez de `x.getchildren()` e `x.iter()` ou `list(x.iter())` em vez de `x.getiterator()`. (Contribuição Serhiy Storchaka no bpo-36543.)

- A API antiga `plistlib` foi removida. Ela tinha sido descontinuada desde o Python 3.4. Use as funções `load()`, `loads()`, `dump()` e `dumps()`. Além disso, o parâmetro use_builtin_types foi removido, os objetos padrão `bytes` são sempre usados em seu lugar. (Contribuição de Jon Janzen em bpo-36409.)

- A função C `PyGen_NeedsFinalizing` foi removida. Ela não foi documentada, testada ou usada em qualquer lugar dentro do CPython após a implementação de PEP 442. Patch de Joannah Nanjekye. (Contribuição de Joannah Nanjekye em bpo-15088)

- `base64.encodestring()` e `base64.decodestring()`, aliases descontinuados desde Python 3.1, foram removidos: use `base64.encodebytes()` e `base64.decodebytes()`. (Contribuição de Victor Stinner em bpo-39351.)

- A função `fractions.gcd()` foi removida, foi descontinuado desde Python 3.5 (bpo-22486): use `math.gcd()` em seu lugar. (Contribuição de Victor Stinner em bpo-39350.)

- O parâmetro buffering de `bz2.BZ2File` foi removido. Desde Python 3.0, ele era ignorado e ao usá-lo emitia uma `DeprecationWarning`. Passe um objeto arquivo aberto para controlar como o arquivo é aberto. (Contribuição de Victor Stinner em bpo-39357.)

- O parâmetro encoding de `json.loads()` foi removido. A partir do Python 3.1, ele foi descontinuado e ignorado; usá-lo emitia uma `DeprecationWarning` desde Python 3.8. (Contribuição de Inada Naoki em bpo-39377)

- As instruções `with (await asyncio.lock):` e `with (yield from asyncio.lock):` não são mais suportadas, use `async with lock`. O mesmo é se aplica para `asyncio.Condition` e `asyncio.Semaphore`. (Contribuição de Andrew Svetlov em bpo-34793.)

- A função `sys.getcounts()`, a opção de linha de comando `-X showalloccount` e o campo `show_alloc_count` da estrutura C `PyConfig` foram removidos. Eles exigiram uma construção especial do Python definindo a macro `COUNT_ALLOCS`. (Contribuição de Victor Stinner em bpo-39489.)

- O atributo `_field_types` da classe `typing.NamedTuple` foi removido. Ele foi descontinuado desde o Python 3.8. Use o atributo `__annotations__`. (Contribuição de Serhiy Storchaka em bpo-40182.)

- O método `symtable.SymbolTable.has_exec()` foi removido. Ele foi descontinuado desde 2006, e retornando apenas `False` quando é chamado. (Contribuição de Batuhan Taskaya em bpo-40208)

- Os métodos `asyncio.Task.current_task()` e `asyncio.Task.all_tasks()` foram removidos. Eles foram descontinuados desde o Python 3.7 e você pode usar `asyncio.current_task()` e `asyncio.all_tasks()` em seu lugar. (Contribuição de Rémi Lapeyre em bpo-40967)

- O método `unescape()` na classe `html.parser.HTMLParser` foi removido (foi descontinuado desde o Python 3.4). `html.unescape()` deve ser usada para converter referências de caracteres para os caracteres Unicode correspondentes.

## Portando para Python 3.9

Esta seção lista as alterações descritas anteriormente e outras correções que podem exigir alterações no seu código.

### Alterações na API Python

- `__import__()` e `importlib.util.resolve_name()` agora levanta `ImportError` onde anteriormente levantava `ValueError`. Os chamadores capturando o tipo de exceção específico e suportando Python 3.9 e versões anteriores precisarão capturar ambas usando `except (ImportError, ValueError):`.

- Os scripts de ativação `venv` não são mais casos especiais quando `__VENV_PROMPT__` está definido como `""`.

- O método `select.epoll.unregister()` não ignora mais o erro `EBADF`. (Contribuição de Victor Stinner em bpo-39239.)

- O parâmetro compresslevel de `bz2.BZ2File` tornou-se uma parâmetro somente-nomeado, uma vez que o parâmetro buffering foi removido. (Contribuição de Victor Stinner em bpo-39357.)

- AST simplificada para assinatura. Índices simples serão representados por seus valores, fatias estendidas serão representadas como tuplas. `Index(value)` retornará um `value` em si, `ExtSlice(slices)` retornará `Tuple(slices, Load())`. (Contribuição de Serhiy Storchaka em bpo-34822.)

- O módulo `importlib` agora ignora a variável de ambiente `PYTHONCASEOK` quando as opções de linha de comando `-E` ou `-I` estão sendo usadas.

- O parâmetro encoding foi adicionado às classes `ftplib.FTP` e `ftplib.FTP_TLS` como um parâmetro somente-nomeado, e a codificação padrão foi alterada de Latin-1 para UTF-8 para siga RFC 2640.

- `asyncio.loop.shutdown_default_executor()` foi adicionado a `AbstractEventLoop`, significando que laços de eventos alternativos que herdam dele devem ter este método definido. (Contribuição de Kyle Stanley em bpo-34037.)

- Os valores constantes de futuras sinalizações no módulo `__future__` são atualizados para evitar colisão com sinalizações do compilador. Anteriormente, `PyCF_ALLOW_TOP_LEVEL_AWAIT` estava em conflito com `CO_FUTURE_DIVISION`. (Contribuição de Batuhan Taskaya em bpo-39562)

- `array('u')` agora usa `wchar_t` como tipo C em vez de `Py_UNICODE`. Esta mudança não afeta seu comportamento porque `Py_UNICODE` é um apelido de `wchar_t` desde Python 3.3. (Contribuição de Inada Naoki em bpo-34538.)

- A API de `logging.getLogger()` agora retorna o logger raiz quando passado o nome `'root'`, enquanto anteriormente retornava um logger não-raiz chamado `'root'`. Isso pode afetar casos onde o código do usuário deseja explicitamente um logger não-root chamado `'root'`, ou instancia um logger usando `logging.getLogger(__name__)` em algum módulo de nível superior chamado `'root.py'`. (Contribuição de Vinay Sajip em bpo-37742.)

- O tratamento de divisão de `PurePath` agora retorna `NotImplemented` ao invés de levantar um `TypeError` quando passado algo diferente de uma instância de `str` ou `PurePath`. Isso permite a criação de classes compatíveis que não herdam desses tipos mencionados. (Contribuição de Roger Aiudi em bpo-34775).

- A partir do Python 3.9.5, o módulo `ipaddress` não aceita mais zeros à esquerda em strings de endereço IPv4. Os zeros à esquerda são ambíguos e interpretados como notação octal por algumas bibliotecas. Por exemplo, a função legada `socket.inet_aton()` trata os zeros à esquerda como notação octal. A implementação glibc de `inet_pton()` moderna não aceita nenhum zeros à esquerda. (Contribuição de Christian Heimes em bpo-36384).

- `codecs.lookup()` agora normaliza o nome da codificação da mesma forma que `encodings.normalize_encoding()`, exceto que `codecs.lookup()` também converte o nome para minúsculas. Por exemplo, `"latex+latin1"` nome de codificação agora está normalizado para `"latex_latin1"`. (Contribuição de Jordon Xu em bpo-37751.)

### Alterações na API C

- Instâncias de tipos alocados por heap (como aquelas criadas com `PyType_FromSpec()` e APIs semelhantes) mantêm uma referência para seu objeto de tipo desde o Python 3.8. Conforme indicado nas “Mudanças na API C” do Python 3.8, para a grande maioria dos casos, não deve haver nenhum efeito colateral, mas para os tipos que têm uma função personalizada `tp_traverse`, certifique-se de que todas as funções `tp_traverse` personalizadas de tipos alocados por heap visitam o tipo do objeto.

  > Exemplo:

  >     int
  >     foo_traverse(foo_struct *self, visitproc visit, void *arg) {
  >     // Rest of the traverse function
  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (Python issue 35810 and 40217)
  >         Py_VISIT(Py_TYPE(self));
  >     #endif
  >     }

  Se sua função transversal delega para `tp_traverse` de sua classe base (ou outro tipo), certifique-se de que `Py_TYPE(self)` seja visitado apenas uma vez. Observe que apenas os tipos de heap devem visitar o tipo em `tp_traverse`.

  > Por exemplo, se sua função `tp_traverse` inclui:

  >     base->tp_traverse(self, visit, arg)

  > adicione:

  >     #if PY_VERSION_HEX >= 0x03090000
  >         // This was not needed before Python 3.9 (Python issue 35810 and 40217)
  >         if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
  >             // a heap type's tp_traverse already visited Py_TYPE(self)
  >         } else {
  >             Py_VISIT(Py_TYPE(self));
  >         }
  >     #else

  (Veja bpo-35810 e bpo-40217 para mais informações.)

- As funções `PyEval_CallObject`, `PyEval_CallFunction`, `PyEval_CallMethod` e `PyEval_CallObjectWithKeywords` foram descontinuadas. Use `PyObject_Call()` e suas variantes. (Veja mais detalhes em bpo-29548.)

### Alterações de bytecode do CPython

- O opcode `LOAD_ASSERTION_ERROR` foi adicionado para tratar a instrução `assert`. Anteriormente, a instrução assert não funcionava corretamente se a exceção `AssertionError` estivesse sendo ocultada. (Contribuição de Zackery Spytz em bpo-34880.)

- O código de operação `COMPARE_OP` foi dividido em quatro instruções distintas:

  - `COMPARE_OP` para comparações ricas

  - `IS_OP` para testes “is” e “is not”

  - `CONTAINS_OP` para testes “in” e “not in”

  - `JUMP_IF_NOT_EXC_MATCH` para verificar exceções em instruções “try-except”.

  (Contribuição de Mark Shannon em bpo-39156.)

## Mudanças na construção

- Adicionada a opção `--with-platlibdir` ao script `configure`: nome do diretório de biblioteca específico da plataforma, armazenado no novo atributo `sys.platlibdir`. Veja o atributo `sys.platlibdir` para mais informações. (Contribuição de Jan Matějek, Matěj Cepl, Charalampos Stratakis e Victor Stinner em bpo-1294959.)

- A macro especial de construção `COUNT_ALLOCS` foi removida. (Contribuição de Victor Stinner em bpo-39489.)

- Em plataformas não Windows, as funções `setenv()` e `unsetenv()` agora são necessárias para construir o Python. (Contribuição de Victor Stinner em bpo-39395.)

- Em plataformas não-Windows, a criação de instaladores `bdist_wininst` não possui mais suporte oficial. (Veja bpo-10945 para mais detalhes.)

- Ao compilar Python no macOS a partir do código-fonte, `_tkinter` agora se vincula a frameworks Tcl e Tk não pertencentes ao sistema se eles estiverem instalados em `/Library/Frameworks`, como era o caso em versões mais antigas do macOS. Se um macOS SDK for explicitamente configurado, usando `--enable-universalsdk=` ou `-isysroot`, apenas o próprio SDK será pesquisado. O comportamento padrão ainda pode ser substituído com `--with-tcltk-includes` e `--with-tcltk-libs`. (Contribuição de Ned Deily em bpo-34956.)

- Python pode agora ser construído para Windows 10 ARM64. (Contribuição de Steve Dower em bpo-33125.)

- Alguns testes individuais agora são ignorados quando `--pgo` é usada. Os testes em questão aumentaram significativamente o tempo da tarefa de PGO e provavelmente não ajudaram a melhorar a otimização do executável final. Isso acelera a tarefa por um fator de cerca de 15x. A execução de todo o conjunto de testes de unidade é lenta. Esta mudança pode resultar em uma construção um pouco menos otimizada, uma vez que nem tantos ramos de código serão executados. Se você estiver disposto a esperar por uma construção muito mais lenta, o comportamento antigo pode ser restaurado usando `./configure [..] PROFILE_TASK="-m test --pgo-extended"`. Não oferecemos garantia de qual conjunto de tarefas de PGO produz uma construção mais rápida. Os usuários que se importam devem executar seus próprios benchmarks relevantes, pois os resultados podem depender do ambiente, da carga de trabalho e da cadeia de ferramentas do compilador. (Veja bpo-36044 e bpo-37707 para mais detalhes.)

## Alterações na API C

### Novas funcionalidades

- PEP 573: Adicionada `PyType_FromModuleAndSpec()` para associar um módulo a uma classe; `PyType_GetModule()` e `PyType_GetModuleState()` para obter o módulo e seu estado; e `PyCMethod` e `METH_METHOD` para permitir que um método acesse a classe na qual ela foi definida. (Contribuição de Marcel Plch e Petr Viktorin em bpo-38787.)

- Adicionada a função `PyFrame_GetCode()`: obtém um código de quadro. Adiciona a função `PyFrame_GetBack()`: obtém o próximo quadro externo. (Contribuição de Victor Stinner em bpo-40421.)

- Adicionada `PyFrame_GetLineNumber()` à API C limitada. (Contribuição de Victor Stinner em bpo-40421.)

- Adicionada as funções `PyThreadState_GetInterpreter()` e `PyInterpreterState_Get()` para obter o interpretador. Adiciona a função `PyThreadState_GetFrame()` para obter o quadro atual de um estado de thread do Python. Adiciona a função `PyThreadState_GetID()`: obtém o identificador único de um estado de thread do Python. (Contribuição de Victor Stinner em bpo-39947.)

- Adicionada uma nova função pública `PyObject_CallNoArgs()` à API C, que chama um objeto chamável Python sem nenhum argumento. É a maneira mais eficiente de chamar um objeto chamável Python sem nenhum argumento. (Contribuição de Victor Stinner em bpo-37194.)

- Alterações na API C limitada (se a macro `Py_LIMITED_API` estiver definida):

  - Fornece `Py_EnterRecursiveCall()` e `Py_LeaveRecursiveCall()` como funções regulares para a API limitada. Anteriormente, eram definidas como macros, mas essas macros não compilavam com a API C limitada, que não pode acessar o campo `PyThreadState.recursion_depth` (a estrutura não é visível na API C limitada).

  - `PyObject_INIT()` e `PyObject_INIT_VAR()` se uma função regular não visível para ocultar os detalhes da implementação.

  (Contribuição de Victor Stinner em bpo-38644 e bpo-39542.)

- A função `PyModule_AddType()` é adicionado para ajudar a adicionar um tipo a um módulo. (Contribuição de Dong-hee Na em bpo-40024.)

- Adicionadas as funções `PyObject_GC_IsTracked()` e `PyObject_GC_IsFinalized()` para a API pública para permitir a consulta se os objetos Python estão sendo rastreados ou já foram finalizados pelo coletor de lixo, respectivamente. (Contribuição de Pablo Galindo em bpo-40241.)

- Adicionada a `_PyObject_FunctionStr()` para obter uma representação amigável para o usuário de strings de um objeto função ou similar. (Patch por Jeroen Demeyer em bpo-37645.)

- Adicionada `PyObject_CallOneArg()` para chamar um objeto com um argumento posicional (Patch de Jeroen Demeyer em bpo-37483.)

### Portando para Python 3.9

- `PyInterpreterState.eval_frame` (PEP 523) agora exige um novo parâmetro tstate obrigatório (`PyThreadState*`). (Contribuição de Victor Stinner em bpo-38500.)

- Módulos de extensão: As funções `m_traverse`, `m_clear` e `m_free` de `PyModuleDef` não são mais chamados se o estado do módulo foi solicitado, mas ainda não está alocado. Este é o caso imediatamente após o módulo ser criado e antes de o módulo ser executado (função `Py_mod_exec`). Mais precisamente, estas funções são são chamados se `m_size` for maior que 0 e o estado do módulo (como retornado por `PyModule_GetState()`) for `NULL`.

  Módulos de extensão sem um estado de módulo (`m_size <= 0`) não são afetados.

- Se `Py_AddPendingCall()` for chamada em um subinterpretador, a função agora está programada para ser chamada a partir do subinterpretador, em vez de ser chamada a partir do interpretador principal. Cada subinterpretador agora tem sua própria lista de chamadas programadas. (Contribuição de Victor Stinner em bpo-39984.)

- O registro do Windows não é mais usado para inicializar `sys.path` quando a opção `-E` é usada (se `PyConfig.use_environment` estiver definido como `0`). Isso é significativo ao incorporar Python no Windows. (Contribuição de Zackery Spytz na bpo-8901.)

- A variável global `PyStructSequence_UnnamedField` agora é uma constante e se refere a uma string constante. (Contribuição de Serhiy Storchaka em bpo-38650.)

- A estrutura `PyGC_Head` agora não é mais visível. Ela só é definida na API C interna (`pycore_gc.h`). (Contribuição de Victor Stinner em bpo-40241.)

- `Py_UNICODE_COPY`, `Py_UNICODE_FILL`, `PyUnicode_WSTR_LENGTH`, `PyUnicode_FromUnicode()`, `PyUnicode_AsUnicode()`, `_PyUnicode_AsUnicode` e `PyUnicode_AsUnicodeAndSize()` estão marcadas como descontinuadas no C. Elas foram descontinuadas pela PEP 393 desde Python 3.3. (Contribuição de Inada Naoki em bpo-36346.)

- A função `Py_FatalError()` é substituída por uma macro que registra automaticamente o nome da função atual, a menos que a macro `Py_LIMITED_API` seja definida. (Contribuição de Victor Stinner em bpo-39882.)

- O protocolo vectorcall agora exige que o chamador passe apenas strings como nomes de argumentos. (Veja bpo-37540 para mais informações.)

- Os detalhes de implementação de uma série de macros e funções agora estão ocultos:

  - A macro `PyObject_IS_GC()` foi convertida para uma função.

  - A macro `PyObject_NEW()` se torna um alias para a macro `PyObject_New()` e a macro `PyObject_NEW_VAR()` se torna um alias para a macro `PyObject_NewVar()`. Elas não acessam mais diretamente o membro `PyTypeObject.tp_basicsize`.

  - A macro `PyObject_GET_WEAKREFS_LISTPTR()` foi convertida para uma função: a macro acessava diretamente o membro `PyTypeObject.tp_weaklistoffset`.

  - A macro `PyObject_CheckBuffer()` foi convertida para uma função: a macro acessava diretamente o membro `PyTypeObject.tp_as_buffer`.

  - `PyIndex_Check()` está agora declarada como uma função “opaca” para ocultar detalhes da implementação: removida a macro `PyIndex_Check()`. A macro acessava diretamente o membro `PyTypeObject.tp_as_number`.

  (Veja bpo-40170 para mais detalhes.)

### Removidos

- Excluídas as macros `PyFPE_START_PROTECT()` e `PyFPE_END_PROTECT()` de `pyfpe.h` da API C limitada. (Contribuição por Victor Stinner em bpo-38835.)

- O slot `tp_print` de PyTypeObject foi removido. Ele era usado para imprimir objetos em arquivos no Python 2.7 e anteriores. Desde Python 3.0, ele era ignorado e não utilizado. (Contribuição de Jeroen Demeyer em bpo-36974.)

- Alterações na API C limitada (se a macro `Py_LIMITED_API` estiver definida):

  - Excluídas as seguintes funções da API C limitada:

    - `PyThreadState_DeleteCurrent()` (Contribuição de Joannah Nanjekye em bpo-37878.)

    - `_Py_CheckRecursionLimit`

    - `_Py_NewReference()`

    - `_Py_ForgetReference()`

    - `_PyTraceMalloc_NewReference()`

    - `_Py_GetRefTotal()`

    - O mecanismo trashcan que nunca funcionou na API C limitada.

    - `PyTrash_UNWIND_LEVEL`

    - `Py_TRASHCAN_BEGIN_CONDITION`

    - `Py_TRASHCAN_BEGIN`

    - `Py_TRASHCAN_END`

    - `Py_TRASHCAN_SAFE_BEGIN`

    - `Py_TRASHCAN_SAFE_END`

  - Movidas as seguintes funções e definições para a API C interna:

    - `_PyDebug_PrintTotalRefs()`

    - `_Py_PrintReferences()`

    - `_Py_PrintReferenceAddresses()`

    - `_Py_tracemalloc_config`

    - `_Py_AddToAllObjects()` (específico para construção de `Py_TRACE_REFS`)

  (Contribuição de Victor Stinner em bpo-38644 e bpo-39542.)

- Removido o gancho `_PyRuntime.getframe` e removida a macro `_PyThreadState_GetFrame` que era um alias para `_PyRuntime.getframe`. Eles eram os únicos expostos pela API C interna. Removido também o tipo `PyThreadFrameGetter`. (Contribuição de Victor Stinner em bpo-39946.)

- Removidas as funções a seguir da API C. Chame `PyGC_Collect()` explicitamente para limpar todas as listas livres. (Contribuição de Inada Naoki e Victor Stinner em bpo-37340, bpo-38896 e bpo-40428.)

  - `PyAsyncGen_ClearFreeLists()`

  - `PyContext_ClearFreeList()`

  - `PyDict_ClearFreeList()`

  - `PyFloat_ClearFreeList()`

  - `PyFrame_ClearFreeList()`

  - `PyList_ClearFreeList()`

  - `PyMethod_ClearFreeList()` e `PyCFunction_ClearFreeList()`: as listas livres de objetos de método vinculado foram removidas.

  - `PySet_ClearFreeList()`: a definição de lista livres foi removida no Python 3.4.

  - `PyTuple_ClearFreeList()`

  - `PyUnicode_ClearFreeList()`: a lista livre de Unicode foi removida no Python 3.3.

- Removida a função `_PyUnicode_ClearStaticStrings()`. (Contribuição de Victor Stinner em bpo-39465.)

- Removido `Py_UNICODE_MATCH`. Ele foi descontinuado por PEP 393 e quebrado desde o Python 3.3. A função `PyUnicode_Tailmatch()` pode ser usada em seu lugar. (Contribuição de Inada Naoki em bpo-36346.)

- Limpados os arquivos de cabeçalho de interfaces definidas, mas sem implementação. Os símbolos públicos da API sendo removidos são: `_PyBytes_InsertThousandsGroupingLocale`, `_PyBytes_InsertThousandsGrouping`, `_Py_InitializeFromArgs`, `_Py_InitializeFromWideArgs`, `_PyFloat_Repr`, `_PyFloat_Digits`, `_PyFloat_DigitsInit`, `PyFrame_ExtendStack`, `_PyAIterWrapper_Type`, `PyNullImporter_Type`, `PyCmpWrapper_Type`, `PySortWrapper_Type`, `PyNoArgsFunction`. (Contribuição de Pablo Galindo Salgado em bpo-39372.)

## Alterações notáveis no Python 3.9.1

### typing

O comportamento de `typing.Literal` foi alterado para ficar em conformidade com a PEP 586 e para corresponder ao comportamento de verificadores de tipo estático especificados na PEP.

1. `Literal` agora elimina a duplicação de parâmetros.

2. Comparações de igualdade entre objetos `Literal` agora são independentes da ordem.

3. Comparações de `Literal` agora respeitam os tipos. Por exemplo, `Literal[0] == Literal[False]` avaliava anteriormente como `True`. Agora é `False`. Para oferecer suporte a essa mudança, o cache de tipo usado internamente agora oferece suporte a tipos de diferenciação.

4. Objetos `Literal` agora irão levantar uma exceção `TypeError` durante as comparações de igualdade se algum de seus parâmetros não for hasheável. Observe que declarar `Literal` com parâmetros mutáveis não gerará um erro:

       >>> from typing import Literal
       >>> Literal[{0}]
       >>> Literal[{0}] == Literal[{False}]
       Traceback (most recent call last):
         File "<stdin>", line 1, in <module>
       TypeError: unhashable type: 'set'

(Contribuição de Yurii Karabas em bpo-42345.)

### Suporte a macOS 11.0 (Big Sur) e Apple Silicon Mac

A partir do 3.9.1, o Python agora oferece suporte total à construção e execução no macOS 11.0 (Big Sur) e no Apple Silicon Macs (baseado na arquitetura `ARM64`). Uma nova variante de compilação universal, `universal2`, está agora disponível para suportar nativamente ambos `ARM64` e `Intel 64` em um conjunto de executáveis. Os binários também podem ser construídos em versões atuais do macOS para serem implantados em uma variedade de versões mais antigas do macOS (testado para 10.9), enquanto algumas funções e opções do sistema operacional mais recentes estão disponíveis condicionalmente com base na versão do sistema operacional em uso no tempo de execução (“ligação fraca”)

(Contribuição de Ronald Oussoren e Lawrence D’Anna em bpo-41100.)

## Alterações notáveis no Python 3.9.2

### collections.abc

`collections.abc.Callable` genérica agora nivela os parâmetros de tipo, semelhante ao que `typing.Callable` faz atualmente. Isso significa que `collections.abc.Callable[[int, str], str]` terá `__args__` de `(int, str, str)`; anteriormente era `([int, str], str)`. Para permitir esta mudança, `types.GenericAlias` agora pode ter uma subclasse, e uma subclasse será retornada ao subscrever o tipo `Collections.abc.Callable`. O código que acessa os argumentos via `typing.get_args()` ou `__args__` precisa levar em conta esta mudança. Um `DeprecationWarning` pode ser emitido para formas inválidas de parametrização `Collections.abc.Callable` que pode ter passado silenciosamente no Python 3.9.1. Esta `DeprecationWarning` se tornará uma `TypeError` no Python 3.10. (Contribuição de Ken Jin em bpo-42195.)

### urllib.parse

Versões anteriores do Python permitiam o uso de `;` e `&` como separadores de parâmetros de consulta nas funções `urllib.parse.parse_qs()` e `urllib.parse.parse_qsl()`. Devido a questões de segurança, e em conformidade com as recomendações mais recentes do W3C, isso foi alterado para permitir apenas uma única chave separadora, com `&` como padrão. Esta mudança também afeta as funções `cgi.parse()` e `cgi.parse_multipart()` já que elas usam as funções afetadas internamente. Para obter mais detalhes, consulte sua respectiva documentação. (Contribuição de Adam Goldschmidt, Senthil Kumaran e Ken Jin em bpo-42967.)

## Alterações notáveis no Python 3.9.3

Uma correção de segurança altera o comportamento `ftplib.FTP` para não confiar no endereço IPv4 enviado do servidor remoto ao configurar um canal de dados passivo. Em vez disso, reutilizamos o endereço IP do servidor ftp. Para códigos incomuns que requerem o comportamento antigo, defina um atributo `trust_server_pasv_ipv4_address` em sua instância de FTP para `True`. (Veja bpo-43285)

## Alterações notáveis no Python 3.9.5

### urllib.parse

A presença de caracteres de nova linha ou tab em partes de um URL permite algumas formas de ataques. Seguindo a especificação WHATWG que atualiza RFC 3986, nova linha ASCII `\n`, `\r` e os caracteres de tabulação `\t` são retirados da URL pelo analisador sintático em `urllib.parse` impedindo tais ataques. Os caracteres de remoção são controlados por uma nova variável de nível de módulo `urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE`. (Veja bpo-43882)

## Recursos de segurança notáveis no 3.9.14

Converter entre `int` e `str` em bases diferentes de 2 (binário), 4, 8 (octal), 16 (hexadecimal) ou 32 como base 10 (decimal) agora levanta uma exceção `ValueError` se o número de dígitos em forma de string estiver acima de um limite para evitar possíveis ataques de negação de serviço devido à complexidade algorítmica. Esta é uma mitigação para CVE-2020-10735. Este limite pode ser configurado ou desabilitado por variável de ambiente, sinalizador de linha de comando ou APIs de `sys`. Veja a documentação de limitação de comprimento de conversão de string inteira. O limite padrão é de 4300 dígitos em forma de string.

## Notable Changes in 3.9.17

### tarfile

- Os métodos de extração em `tarfile` e `shutil.unpack_archive()`, têm um novo argumento filter que permite limitar recursos do tar que podem ser surpreendentes ou perigosos, como criar arquivos fora do diretório de destino. Veja Filtros de extração para detalhes. No Python 3.12, usar sem o argumento filter mostrará um `DeprecationWarning`. No Python 3.14, o padrão mudará para `'data'`. (Contribuição de Petr Viktorin em PEP 706.)

## Notable changes in 3.9.20

### ipaddress

- Corrigido o comportamento de `is_global` e `is_private` em `IPv4Address`, `IPv6Address`, `IPv4Network` e `IPv6Network`.

### email

- Cabeçalhos com novas linhas embutidas agora são colocados entre aspas na saída.

  O `generator` agora se recusará a serializar (escrever) cabeçalhos que são dobrados ou delimitados incorretamente, de modo que eles seriam analisados como vários cabeçalhos ou unidos a dados adjacentes. Se você precisar desativar esse recurso de segurança, defina `verify_generated_headers`. (Contribuição de Bas Bloemsaat e Petr Viktorin em gh-121650.)

- `email.utils.getaddresses()` e `email.utils.parseaddr()` agora retornam tuplas de 2 elementos `('', '')` em mais situações onde endereços de e-mail inválidos são encontrados, em vez de valores potencialmente imprecisos. Um parâmetro strict opcional foi adicionado a essas duas funções: use `strict=False` para obter o comportamento antigo, aceitando entradas malformadas. `getattr(email.utils, 'supports_strict_parsing', False)` pode ser usado para verificar se o parâmetro strict está disponível. (Contribuição de Thomas Dwyer e Victor Stinner para gh-102988 para melhorar a correção de CVE-2023-27043.)

## Notable changes in 3.9.23

### os.path

- The strict parameter was backported to `os.path.realpath()` to allow for `tarfile` to use it for security vulnerability mitigation. In particular, when strict is set to `os.path.ALLOW_MISSING`, errors other than `FileNotFoundError` will be re-raised; the resulting path can be missing but it will be free of symlinks. (Contributed by Petr Viktorin for CVE 2025-4517.)

### tarfile

- `data_filter()` now normalizes symbolic link targets in order to avoid path traversal attacks. (Contributed by Petr Viktorin in gh-127987 and CVE 2025-4138.)

- `extractall()` now skips fixing up directory attributes when a directory was removed or replaced by another kind of file. (Contributed by Petr Viktorin in gh-127987 and CVE 2024-12718.)

- `extract()` and `extractall()` now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception, `LinkFallbackError`. (Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)

- `extract()` and `extractall()` no longer extract rejected members when `errorlevel()` is zero. (Contributed by Matt Prodani and Petr Viktorin in gh-112887 and CVE 2025-4435.)