O que há de novo no Python 3.9
******************************

Versão:
   3.9.23

Data:
   julho 09, 2025

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