O que há de novo no Python 3.9¶
- Editor:
Łukasz Langa
Este artigo explica os novos recursos no Python 3.9, em comparação com 3.8. Python 3.9 foi lançado em 15 de outubro de 2020. Veja o changelog. para uma lista completa de mudanças.
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 = {"chave1": "valor1 from x", "chave2": "valor2 from x"}
>>> y = {"chave2": "valor2 from y", "chave3": "valor3 from y"}
>>> x | y
{'chave1': 'valor1 from x', 'chave2': 'valor2 from y', 'chave3': 'valor3 from y'}
>>> y | x
{'chave2': 'valor2 from x', 'chave3': 'valor3 from y', 'chave1': 'valor1 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 cumprimentar_todos(nomes: list[str]) -> None:
for nome in nomes:
print("Olá", nome)
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 levantaImportError
em vez deValueError
, 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 poros.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()
ebytes.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 retornas
em vez de uma string vazia para todosn
não zero. Isso é agora consistente com"".replace("", s)
. Há alterações similares para objetosbytes
ebytearray
. (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 (comoUnion
eList
). Usandohelp()
com alias genérico comoList[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 eag_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 porTypeError
no operadorin
e nas funçõescontains()
,indexOf()
ecountOf()
do módulooperator
. (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
>>> # Tempo em fuso horário com horário de verão
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Tempo padrão
>>> 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 TypeError
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 Donghee 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 Donghee 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 Donghee 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 Donghee 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 Donghee Na em bpo-39259.)
os¶
Adicionadas as constantes CLD_KILLED
e CLD_STOPPED
para si_code
. (Contribuição de Donghee 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.)
pathlib¶
Adicionado pathlib.Path.readlink()
, que age de maneira semelhante a os.readlink()
. (Contribuição de Girts Folkmanis em bpo-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 Donghee 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 milissegundos. (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.)
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 simplesy = 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 usandoclosefrom()
. (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 Donghee 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 Donghee 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:
Versão do Python 3.4 3.5 3.6 3.7 3.8 3.9
-------------- --- --- --- --- --- ---
Acesso de leitura a variável e atributo:
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
Acesso de escrita a variável e atributo:
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
Acesso de leitura a estrutura de dados:
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
Acesso de escrita a estrutura de dados:
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
Operações em pilha (ou fila):
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
Tempo de laços:
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, usebdist_wheel
(pacotes wheel). (Contribuição de Hugo van Kemenade em bpo-39586.)Atualmente
math.factorial()
aceita instâncias dafloat
com valores inteiros não negativos (como5.0
). Ela levanta umaValueError
para flutuadores não integrais e negativos. Agora está descontinuado. Nas versões futuras do Python, será levantada umaTypeError
para todos os flutuadores. (Contribuição de Serhiy Storchaka em bpo-37315.)Os módulos
parser
esymbol
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 Árvore de Sintaxe Abstrata (AST), usando o móduloast
.As funções públicas de API C
PyParser_SimpleParseStringFlags()
,PyParser_SimpleParseStringFlagsFilename()
,PyParser_SimpleParseFileFlags()
ePyNode_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 umaTypeError
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 aNone
,int
,float
,str
,bytes
ebytearray
.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étodosplitlist()
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 foram descontinuados. O módulo
binhex
e as seguintes funçõesbinascii
foram descontinuadas:b2a_hqx()
,a2b_hqx()
rlecode_hqx()
,rledecode_hqx()
(Contribuição de Victor Stinner em bpo-39353.)
As classes
slice
,Index
eExtSlice
deast
são consideradas descontinuadas e serão removidas nas versões futuras do Python. O própriovalue
deve ser usado em vez deIndex(value)
.Tuple(slices, Load())
deve ser usada em vez deExtSlice(slices)
. (Contribuição de Serhiy Storchaka em bpo-34822.)As classes
Suite
,Param
,AugLoad
eAugStore
deast
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()
ePyEval_ThreadsInitialized()
agora estão descontinuadas e serão removidas no Python 3.11. ChamarPyEval_InitThreads()
agora não faz nada. A GIL é inicializada porPy_Initialize()
desde o Python 3.7. (Contribuição de Victor Stinner em bpo-39877.)Passar
None
como o primeiro argumento para a funçãoshlex.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 umPendingDeprecationWarning
. 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ódulolib2to3
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étodosxpath()
exgtitle()
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. Paraxgtitle()
, usenntplib.NNTP.descriptions()
ounntplib.NNTP.description()
. (Contribuição de Donghee Na em bpo-39366.)array.array
: os métodostostring()
efromstring()
foram removidos. Eles eram aliases paratobytes()
efrombytes()
, 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 retornouNone
. É necessária uma opção de compilação especialCALL_PROFILE
que já foi removida no Python 3.7. (Contribuição de Victor Stinner em bpo-37414.)As funções
sys.getcheckinterval()
esys.setcheckinterval()
foram removidas. Elas foram descontinuadas desde o Python 3.2. Usesys.getswitchinterval()
esys.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
edummy_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.)O apelido
aifc.openfp()
paraaifc.open()
, o apelidosunau.openfp()
parasunau.open()
e o apelidowave.openfp()
parawave.open()
foram removidos. Eles estavam descontinuados desde o Python 3.7. (Contribuição de Victor Stinner em bpo-37320.)O método
isAlive()
dethreading.Thread
foi removido. Ele foi descontinuado desde o Python 3.8. Useis_alive()
ao invés. (Contribuição de Donghee Na em bpo-37804.)Os métodos
getchildren()
egetiterator()
das classesElementTree
eElement
no móduloElementTree
foram removidos. Eles foram descontinuados no Python 3.2. Useiter(x)
oulist(x)
em vez dex.getchildren()
ex.iter()
oulist(x.iter())
em vez dex.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çõesload()
,loads()
,dump()
edumps()
. Além disso, o parâmetro use_builtin_types foi removido, os objetos padrãobytes
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()
ebase64.decodestring()
, aliases descontinuados desde Python 3.1, foram removidos: usebase64.encodebytes()
ebase64.decodebytes()
. (Contribuição de Victor Stinner em bpo-39351.)A função
fractions.gcd()
foi removida, foi descontinuado desde Python 3.5 (bpo-22486): usemath.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 umaDeprecationWarning
. 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 umaDeprecationWarning
desde Python 3.8. (Contribuição de Inada Naoki em bpo-39377)As instruções
with (await asyncio.lock):
ewith (yield from asyncio.lock):
não são mais suportadas, useasync with lock
. O mesmo é se aplica paraasyncio.Condition
easyncio.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 camposhow_alloc_count
da estrutura CPyConfig
foram removidos. Eles exigiam uma construção especial do Python definindo a macroCOUNT_ALLOCS
. (Contribuição de Victor Stinner em bpo-39489.)O atributo
_field_types
da classetyping.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 apenasFalse
quando é chamado. (Contribuição de Batuhan Taskaya em bpo-40208)Os métodos
asyncio.Task.current_task()
easyncio.Task.all_tasks()
foram removidos. Eles foram descontinuados desde o Python 3.7 e você pode usarasyncio.current_task()
easyncio.all_tasks()
em seu lugar. (Contribuição de Rémi Lapeyre em bpo-40967)O método
unescape()
na classehtml.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__()
eimportlib.util.resolve_name()
agora levantaImportError
onde anteriormente levantavaValueError
. Os chamadores capturando o tipo de exceção específico e suportando Python 3.9 e versões anteriores precisarão capturar ambas usandoexcept (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 erroEBADF
. (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á umvalue
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 ambientePYTHONCASEOK
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
eftplib.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 aAbstractEventLoop
, 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 comCO_FUTURE_DIVISION
. (Contribuição de Batuhan Taskaya em bpo-39562)array('u')
agora usawchar_t
como tipo C em vez dePy_UNICODE
. Esta mudança não afeta seu comportamento porquePy_UNICODE
é um apelido dewchar_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 usandologging.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 retornaNotImplemented
ao invés de levantar umTypeError
quando passado algo diferente de uma instância destr
ouPurePath
. 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 legadasocket.inet_aton()
trata os zeros à esquerda como notação octal. A implementação glibc deinet_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 queencodings.normalize_encoding()
, exceto quecodecs.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 personalizadatp_traverse
, certifique-se de que todas as funçõestp_traverse
personalizadas de tipos alocados por heap visitam o tipo do objeto.Exemplo:
int travessia_foo(foo_struct *self, visitproc visit, void *arg) { // Resto da função de travessia #if PY_VERSION_HEX >= 0x03090000 // Isso não era necessário antes do Python 3.9 (problemas 35810 e 40217 do Python) 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 quePy_TYPE(self)
seja visitado apenas uma vez. Observe que apenas os tipos de heap devem visitar o tipo emtp_traverse
.Por exemplo, se sua função
tp_traverse
inclui:base->tp_traverse(self, visit, arg)
adicione:
#if PY_VERSION_HEX >= 0x03090000 // Isso não era necessário antes do Python 3.9 (bpo-35810 e bpo-40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // tp_traverse de um tipo de heap já visitou Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
As funções
PyEval_CallObject
,PyEval_CallFunction
,PyEval_CallMethod
ePyEval_CallObjectWithKeywords
foram descontinuadas. UsePyObject_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çãoassert
. Anteriormente, a instrução assert não funcionava corretamente se a exceçãoAssertionError
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 ricasIS_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 scriptconfigure
: nome do diretório de biblioteca específico da plataforma, armazenado no novo atributosys.platlibdir
. Veja o atributosys.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()
eunsetenv()
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
, somente o SDK em si será procurado. Esse comportamento padrão pode ser sobreposto com--with-tcltk-include
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()
ePyType_GetModuleState()
para obter o módulo e seu estado; ePyCMethod
eMETH_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çãoPyFrame_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()
ePyInterpreterState_Get()
para obter o interpretador. Adiciona a funçãoPyThreadState_GetFrame()
para obter o quadro atual de um estado de thread do Python. Adiciona a funçãoPyThreadState_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()
ePy_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 campoPyThreadState.recursion_depth
(a estrutura não é visível na API C limitada).PyObject_INIT()
ePyObject_INIT_VAR()
se uma função regular não visível para ocultar os detalhes da implementação.
A função
PyModule_AddType()
é adicionado para ajudar a adicionar um tipo a um módulo. (Contribuição de Donghee Na em bpo-40024.)Adicionadas as funções
PyObject_GC_IsTracked()
ePyObject_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
em_free
dePyModuleDef
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çãoPy_mod_exec
). Mais precisamente, estas funções são são chamados sem_size
for maior que 0 e o estado do módulo (como retornado porPyModule_GetState()
) forNULL
.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 (sePyConfig.use_environment
estiver definido como0
). 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 é opaca. 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
ePyUnicode_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 macroPy_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 apelido para a macroPyObject_New
e a macroPyObject_NEW_VAR()
se torna um apelido para a macroPyObject_NewVar
. Elas não acessam mais diretamente o membroPyTypeObject.tp_basicsize
.A macro
PyObject_GET_WEAKREFS_LISTPTR()
foi convertida para uma função: a macro acessava diretamente o membroPyTypeObject.tp_weaklistoffset
.A macro
PyObject_CheckBuffer()
foi convertida para uma função: a macro acessava diretamente o membroPyTypeObject.tp_as_buffer
.PyIndex_Check()
está agora declarada como uma função “opaca” para ocultar detalhes da implementação: removida a macroPyIndex_Check()
. A macro acessava diretamente o membroPyTypeObject.tp_as_number
.
(Veja bpo-40170 para mais detalhes.)
Removidos¶
Excluídas as macros
PyFPE_START_PROTECT()
ePyFPE_END_PROTECT()
depyfpe.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 dePy_TRACE_REFS
)
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 tipoPyThreadFrameGetter
. (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()
ePyCFunction_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çãoPyUnicode_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.
Literal
agora elimina a duplicação de parâmetros.Comparações de igualdade entre objetos
Literal
agora são independentes da ordem.Comparações de
Literal
agora respeitam os tipos. Por exemplo,Literal[0] == Literal[False]
avaliava anteriormente comoTrue
. Agora éFalse
. Para oferecer suporte a essa mudança, o cache de tipo usado internamente agora oferece suporte a tipos de diferenciação.Objetos
Literal
agora irão levantar uma exceçãoTypeError
durante as comparações de igualdade se algum de seus parâmetros não for hasheável. Observe que declararLiteral
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 gh-87451)
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 gh-88048)
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.
Alterações notáveis no 3.9.17¶
tarfile¶
Os métodos de extração em
tarfile
eshutil.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á umDeprecationWarning
. No Python 3.14, o padrão mudará para'data'
. (Contribuição de Petr Viktorin em PEP 706.)