O que há de novo no Python 3.12¶
- Editor:
Adam Turner
Este artigo explica os novos recursos no Python 3.12, em comparação com 3.11. Python 3.12 foi lançado em 2 de outubro de 2023. Veja changelog para uma lista completa de mudanças.
Ver também
PEP 693 – Agendamento de lançamento do Python 3.12
Resumo – Destaques da versão¶
Python 3.12 é uma versão estável da linguagem de programação Python, com uma combinação de alterações na linguagem e na biblioteca padrão. As alterações da biblioteca se concentram na limpeza de APIs descontinuadas, usabilidade e correção. É importante notar que o pacote distutils foi removido da biblioteca padrão. O suporte ao sistema de arquivos em os e pathlib teve uma série de melhorias e vários módulos têm melhor desempenho.
As mudanças de linguagem se concentram na usabilidade, já que f-strings tiveram muitas limitações removidas e as sugestões ‘Did you mean …’ continuam a melhorar. A nova sintaxe de parâmetro type e a instrução type melhoram a ergonomia para usar tipos genéricos e apelidos de tipos com verificadores de tipo estáticos.
Este artigo não tenta fornecer uma especificação completa de todos os novos recursos, mas fornece uma visão geral conveniente. Para detalhes completos, você deve consultar a documentação, como Referência da Biblioteca e Referência da Linguagem. Se você quiser entender a implementação completa e a justificativa do design para uma mudança, consulte a PEP para um novo recurso específico; mas observe que as PEPs geralmente não são mantidas atualizadas depois que um recurso é totalmente implementado.
Novos recursos de sintaxe:
Novos recursos de gramática:
Melhorias no interpretador:
PEP 669, monitoramento de baixo impacto
Aprimoradas as sugestões ‘Did you mean …’ para as exceções
NameError,ImportErroreSyntaxError
Melhorias no modelo de dados Python:
PEP 688, usando o protocolo de buffer do Python
Melhorias significativas na biblioteca padrão:
A classe
pathlib.Pathagora oferece suporte a fazer subclassesO módulo
osrecebeu vários aprimoramentos para suporte ao WindowsUma interface de linha de comando foi adicionada ao módulo
sqlite3As verificações de
isinstance()paraprotocolos verificáveis em tempo de execuçãodesfruta de um aumento de velocidade entre duas e 20 vezesO pacote
asyncioteve vários aprimoramentos desempenho, com alguns benchmarks mostrando um aumento de 75% na velocidade.Uma interface de linha de comando foi adicionada ao módulo
uuidDevido às alterações na PEP 701, a produção de tokens por meio do módulo
tokenizeé até 64% mais rápida.
Melhorias de Segurança:
Substitui as implementações embutidas do
hashlibde SHA1, SHA3, SHA2-384, SHA2-512 e MD5 pelo código formalmente verificado do projeto HACL*. Essas implementações embutidas permanecem como fallbacks que são usados somente quando o OpenSSL não as fornece.
Melhorias na API C:
Melhorias na implementação do CPython:
PEP 709, inlining de compreensão
Suporte do CPython para o perfilador Linux
perfImplementa proteção contra estouro de pilha em plataformas suportadas
Novos recursos de tipagem:
PEP 698, decorador
typing.override()
Descontinuações, remoções ou restrições importantes:
PEP 623: Remove
wstros objetos Unicode na API C do Python, reduzindo o tamanho de cada objetostrem pelo menos 8 bytes.PEP 632: Remove o pacote
distutils. Consulte o guia de migração para obter conselhos sobre a substituição das APIs fornecidas por ele. O pacote de terceiros Setuptools continua fornecendodistutils, se você ainda precisar dele no Python 3.12 e posterior.gh-95299: Não pré-instala
setuptoolsem ambientes virtuais criados comvenv. Isso significa quedistutils,setuptools,pkg_resourceseeasy_installnão estarão mais disponíveis por padrão; para acessá-los, executepip install setuptoolsno ambiente virtual ativado.Os módulos
asynchat,asyncoreeimpforam removidos, juntamente com vários apelidos de métodos deunittest.TestCase.
Novas funcionalidades¶
PEP 695: Sintaxe do parâmetro de tipo¶
As classes e funções genéricas sob a PEP 484 foram declaradas usando uma sintaxe detalhada que deixou o escopo dos parâmetros de tipo pouco claro e exigiu declarações explícitas de variação.
PEP 695 apresenta uma maneira nova, mais compacta e explícita de criar classes genéricas e funções:
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
Além disso, a PEP introduz uma nova maneira de declarar apelidos de tipos usando a instrução type, que cria uma instância de TypeAliasType:
type Point = tuple[float, float]
Os apelidos de tipo também podem ser genéricos:
type Point[T] = tuple[T, T]
A nova sintaxe permite declarar os parâmetros TypeVarTuple e ParamSpec, bem como os parâmetros TypeVar com limites ou restrições:
type IntFunc[**P] = Callable[P, int] # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T] # TypeVar com vínculo
type IntOrStrSequence[T: (int, str)] = Sequence[T] # TypeVar com restrições
O valor dos apelidos de tipo e os limites e restrições das variáveis de tipo criadas por meio dessa sintaxe são avaliados somente sob demanda (consulte avaliação preguiçosa). Isso significa que os apelidos de tipo podem se referir a outros tipos definidos posteriormente no arquivo.
Os parâmetros de tipo declarados por meio de uma lista de parâmetros de tipo são visíveis no escopo da declaração e em quaisquer escopos aninhados, mas não no escopo externo. Por exemplo, eles podem ser usados nas anotações de tipo para os métodos de uma classe genérica ou no corpo da classe. Entretanto, não podem ser usadas no escopo do módulo depois que a classe é definida. Consulte Listas de parâmetros de tipo para obter uma descrição detalhada da semântica de tempo de execução dos parâmetros de tipo.
Para dar suporte a essa semântica de escopo, um novo tipo de escopo é introduzido, o escopo de anotação. Os escopos de anotação se comportam, em sua maior parte, como escopos de função, mas interagem de forma diferente com os escopos de classe. No Python 3.13, anotações também serão avaliadas em escopos de anotação.
Consulte PEP 695 para obter mais detalhes.
(PEP escrita por Eric Traut. Implementação por Jelle Zijlstra, Eric Traut e outros em gh-103764).
PEP 701: Formalização sintática de f-strings¶
PEP 701 resolve algumas restrições no uso de f-strings. Componentes de expressão dentro de f-strings agora podem ser qualquer expressão válida do Python, incluindo strings reutilizando a mesma aspa que a f-string contida, expressões multi-linhas, comentários, barras invertidas e sequências de escape unicode. Vamos cobri-los em detalhes:
Reuso de aspas: no Python 3.11, reusar as mesmas aspas que a f-string que contém levanta um
SyntaxError, forçando o usuário a usar outras aspas disponíveis (como usar aspas duplas ou triplas se a f-string usa aspas simples). No Python 3.12, agora você pode fazer coisas como esta:>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism'] >>> f"This is the playlist: {", ".join(songs)}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
Observe que, antes dessa alteração, não havia limite explícito de como f-strings podem ser aninhadas, mas o fato de as aspas de string não poderem ser reusadas dentro do componente de expressão de f-strings tornava impossível aninhar f-strings arbitrariamente. Na verdade, esta é a f-string mais aninhada que poderia ser escrita:
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
Como agora f-strings podem conter qualquer expressão Python válida dentro de componentes de expressão, agora é possível aninhar f-strings arbitrariamente:
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
Expressões e comentários multilinhas: no Python 3.11, as expressões f-string devem ser definidas em uma única linha, ainda que a expressão dentro de f-string externas possa normalmente abranger várias linhas (como listas literais sendo definidas em várias linhas), tornando-as mais difíceis de ler. No Python 3.12, agora você pode definir f-strings abrangendo várias linhas e adicionar comentários inline:
>>> f"This is the playlist: {", ".join([ ... 'Take me back to Eden', # My, my, those eyes like fire ... 'Alkaline', # Not acid nor alkaline ... 'Ascensionism' # Take to the broken skies at last ... ])}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'Contrabarra e caracteres unicode: antes do Python 3.12, as expressões f-string não podiam conter nenhum caractere
\. Isso também afetou as sequências de escape unicode (como\N{snowman}), pois elas contêm a parte\Nque anteriormente não podia fazer parte dos componentes de expressão de f-strings. Agora, você pode definir expressões como esta:>>> print(f"This is the playlist: {"\n".join(songs)}") This is the playlist: Take me back to Eden Alkaline Ascensionism >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
Veja PEP 701 para mais detalhes.
Como um efeito colateral positivo de como esse recurso foi implementado (analisando f-strings com o analisador GASE ou PEG), agora as mensagens de erro para f-strings são mais precisas e incluem o local exato do erro. Por exemplo, no Python 3.11, a seguinte f-string levanta um SyntaxError:
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
(x z y)
^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
mas a mensagem de erro não inclui o local exato do erro dentro da linha e também tem a expressão artificialmente cercada por parênteses. No Python 3.12, como as f-strings são analisadas com o analisador GASE, as mensagens de erro podem ser mais precisas e mostrar a linha inteira:
>>> minha_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
minha_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Contribuição de Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou, Cristián Maureira-Fredes e Marta Gómez em gh-102856. PEP escrito por Pablo Galindo, Batuhan Taskaya, Lysandros Nikolaou e Marta Gómez).
PEP 684: Uma GIL por interpretador¶
A PEP 684 introduz uma GIL por interpretador, para que subinterpretadores possam agora ser criados com uma GIL único por interpretador. Isso permite que programas Python aproveitem ao máximo vários núcleos de CPU. Isso está atualmente disponível apenas por meio da API C, embora uma API Python seja esperada para 3.13.
Use a nova função Py_NewInterpreterFromConfig() para criar um interpretador com sua própria GIL:
PyInterpreterConfig config = {
.check_multi_interp_extensions = 1,
.gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
return -1;
}
/* O novo interpretador agora está ativo na atual thread. */
Para obter mais exemplos de como usar a API C para subinterpretadores com uma GIL por interpretador, consulte Modules/_xxsubinterpretersmodule.c.
(Contribuição de Eric Snow em gh-104210, etc.)
PEP 669: Monitoramento de baixo impacto para CPython¶
A PEP 669 define uma nova API para perfis, depuradores e outras ferramentas monitorarem eventos no CPython. Ela abrange uma ampla gama de eventos, incluindo chamadas, retornos, linhas, exceções, saltos e mais. Isso significa que você só paga pelo que usa, fornecendo suporte para depuradores e ferramentas de cobertura com sobrecarga quase zero. Veja sys.monitoring para mais detalhes.
(Contribuição de Mark Shannon em gh-103082.)
PEP 688: Tornando o protocolo de buffer acessível no Python¶
A PEP 688 apresenta uma maneira de usar o protocolo de buffer do código Python. As classes que implementam o método __buffer__() agora podem ser usadas como tipos de buffer.
O novo collections.abc.Buffer ABC fornece uma maneira padrão de representar objetos de buffer, por exemplo, em anotações de tipo. A nova enumeração inspect.BufferFlags representa os sinalizadores que podem ser usados para personalizar a criação do buffer. (Contribuição de Jelle Zijlstra em gh-102500.)
PEP 709: Fazendo inline de compreensão¶
As compreensões de dicionário, lista e conjunto agora estão embutidas, em vez de criar um novo objeto função de uso único para cada execução da compreensão. Isso acelera a execução de uma compreensão em até duas vezes. Veja PEP 709 para mais detalhes.
As variáveis de iteração de compreensão permanecem isoladas e não sobrescrevem uma variável de mesmo nome no escopo externo, nem são visíveis após a compreensão. O uso de inlining resulta em algumas mudanças visíveis de comportamento:
Não há mais um quadro separado para a compreensão em tracebacks (situação da pilha de execução), e o rastreamento/criação de perfil não mostra mais a compreensão como uma chamada de função.
O módulo
symtablenão produzirá mais tabelas de símbolos filhos para cada compreensão; em vez disso, os locais da compreensão serão incluídos na tabela de símbolos da função pai.Chamar
locals()dentro de uma compreensão agora inclui variáveis de fora da compreensão e não inclui mais a variável sintética.0para o “argumento” de compreensão.Uma compreensão que itera diretamente sobre
locals()(por exemplo,[k for k in locals()]) pode ver “RuntimeError: dictionary changed size during iteration” quando executada sob rastreamento (por exemplo, medição de cobertura de código). Esse é o mesmo comportamento já observado, por exemplo, emfor k in locals():. Para evitar o erro, primeiro crie uma lista de chaves para iterar:keys = list(locals()); [k for k in keys].
(Contribuição de Carl Meyer and Vladimir Matveev em PEP 709.)
Mensagens de erro melhoradas¶
Os módulos da biblioteca padrão agora são potencialmente sugeridos como parte das mensagens de erro exibidas pelo interpretador quando uma exceção
NameErroré levantada ao nível superior. (Contribuição de Pablo Galindo em gh-98254.)>>> sys.version_info Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'sys' is not defined. Did you forget to import 'sys'?
Melhora a sugestão de erro para exceções
NameErrorpara instâncias. Agora, se uma exceçãoNameErrorfor levantada em um método e a instância tiver um atributo que é exatamente igual ao nome na exceção, a sugestão incluiráself.<NOME>em vez da correspondência mais próxima no escopo do método. (Contribuição de Pablo Galindo em gh-99139.)>>> class A: ... def __init__(self): ... self.blech = 1 ... ... def foo(self): ... somethin = blech ... >>> A().foo() Traceback (most recent call last): File "<stdin>", line 1 somethin = blech ^^^^^ NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
Melhora a mensagem de erro de
SyntaxErrorquando o usuário digitaimport x from yao invés defrom y import x. (Contribuição de Pablo Galindo em gh-98931.)>>> import a.y.z from b.y.z Traceback (most recent call last): File "<stdin>", line 1 import a.y.z from b.y.z ^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Did you mean to use 'from ... import ...' instead?
Exceções
ImportErrorlevantadas a partir de instruçõesfrom <módulo> import <nome>com falha agora incluem sugestões para o valor de<nome>com base nos nomes disponíveis em<módulo>. (Contribuição de Pablo Galindo em gh-91058.)>>> from collections import chainmap Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
Outras mudanças na linguagem¶
O analisador sintático agora exibe
SyntaxErrorao analisar o código-fonte que contém bytes nulos. (Contribuição de Pablo Galindo em gh-96670.)Um par de caracteres de barra invertida que não seja uma sequência de escape válida agora levanta uma exceção
SyntaxWarning, em vez deDeprecationWarning. Por exemplo,re.compile("\d+\.\d+")agora emite umSyntaxWarning("\d"é uma sequência de escape inválida, use strings brutas para expressão regular:re.compile(r"\d+\.\d+")). Em uma versão futura do Python,SyntaxErroracabará sendo levantada, em vez deSyntaxWarning. (Contribuição de Victor Stinner em gh-98401.)Escapes octais com valor maior do que
0o377(ex:"\477"), descontinuados no Python 3.11, agora produzem umSyntaxWarning, em vez deDeprecationWarning. Em uma versão futura do Python, eles serão eventualmente umSyntaxError. (Contribuição de Victor Stinner em gh-98401.)As variáveis usadas na parte de destino das compreensões que não são armazenadas agora podem ser usadas em expressões de atribuição (
:=). Por exemplo, em[(b := 1) for a, b.prop in some_iter], a atribuição abagora é permitida. Observe que a atribuição a variáveis armazenadas em na parte de destino das compreensões (comoa) ainda não é permitida, conforme PEP 572. (Contribuição de Nikita Sobolev em gh-100581.)As exceções levantadas em um método
__set_name__de uma classe ou um tipo não são mais envolvidas por umRuntimeError. As informações de contexto são adicionadas à exceção como uma nota PEP 678. (Contribuição de Irit Katriel em gh-77757.)Quando uma construção
try-except*lida com toda aExceptionGroupe levanta uma outra exceção, essa exceção não é mais envolvida em umaExceptionGroup. Também alterada na versão 3.11.4. (Contribuição de Irit Katriel em gh-103590.)O coletor de lixo agora é executado somente no mecanismo de quebra de avaliação do laço de avaliação de bytecode do Python em vez de alocações de objetos. O coletor de lixo também pode ser executado quando
PyErr_CheckSignals()é chamado, de modo que as extensões C que precisam ser executadas por um longo período sem executar nenhum código Python também têm a chance de executar o coletor de lixo periodicamente. (Contribuição de Pablo Galindo em gh-97922.)Todos os chamáveis internos e de extensão que esperam parâmetros booleanos agora aceitam argumentos de qualquer tipo, em vez de apenas
booleint. (Contribuição de Serhiy Storchaka em gh-60203.)memoryviewagora oferece suporte ao tipo meio ponto flutuante (o código de formato “e”). (Contribuição de Donghee Na e Antoine Pitrou em gh-90751.)Objetos
sliceagora são hasheáveis, permitindo que sejam usados como chaves de dicionário e itens de conjunto. (Contribuição de Will Bradshaw, Furkan Onder e Raymond Hettinger em gh-101264.)sum()agora usa a soma de Neumaier para melhorar a precisão e comutatividade ao somar valores flutuantes ou misturas de ints e floats. (Contribuição de Raymond Hettinger em gh-100425.)ast.parse()agora exibeSyntaxErrorem vez deValueErrorao analisar o código-fonte que contém bytes nulos. (Contribuição de Pablo Galindo em gh-96670.)Os métodos de extração em
tarfileeshutil.unpack_archive()têm um novo argumento filter que permite limitar os recursos do tar que podem ser surpreendentes ou perigosos, como a criação de arquivos fora do diretório de destino. Consulte arquivos de extração de de arquivos tar para obter detalhes. No Python 3.14, o padrão mudará para'data'. (Contribuição de Petr Viktorin em PEP 706.)Instâncias de
types.MappingProxyTypeagora são hasheáveis se o mapeamento subjacente for hasheável (Contribuição de Serhiy Storchaka em gh-87995.)Adiciona suporte ao perfilador perf por meio da nova variável de ambiente
PYTHONPERFSUPPORTe da opção de linha de comando-X perf, bem como das novas funçõessys.activate_stack_trampoline(),sys.deactivate_stack_trampoline()esys.is_stack_trampoline_active(). (Design de Pablo Galindo. Contribuição de Pablo Galindo e Christian Heimes com contribuições de Gregory P. Smith [Google] e Mark Shannon em gh-96123).
Novos módulos¶
Nenhum.
Módulos melhorados¶
array¶
A classe
array.arrayagora suporta subscrição, tornando-a um tipo genérico. (Contribuição de Jelle Zijlstra em gh-98658.)
asyncio¶
O desempenho da gravação em soquetes no
asynciofoi significativamente aprimorado. Oasyncioagora evita cópias desnecessárias ao gravar em soquetes e usa osendmsg()se a plataforma o suportar. (Contribuição de Kumar Aditya em gh-91166.)Adiciona as funções
asyncio.eager_task_factory()easyncio.create_eager_task_factory()para permitir a opção de um laço de eventos na execução de tarefas ansiosas, tornando alguns casos de uso de 2x a 5x mais rápidos. (Contribuição de Jacob Bower e Itamar Oren em gh-102853, gh-104140 e gh-104138)No Linux,
asynciousaasyncio.PidfdChildWatcherpor padrão seos.pidfd_open()estiver disponível e funcional em vez deasyncio.ThreadedChildWatcher. (Contribuição de Kumar Aditya em gh-98024.)O laço de eventos agora usa o melhor observador filho disponível para cada plataforma (
asyncio.PidfdChildWatcherse suportado easyncio.ThreadedChildWatchercaso contrário), portanto, configurar manualmente um observador filho não é recomendado. (Contribuição de Kumar Aditya em gh-94597.)Adiciona o parâmetro loop_factory a
asyncio.run()para permitir a especificação de uma fábrica de laço de eventos personalizada. (Contribuição de Kumar Aditya em gh-99388.)Adiciona implementação C de
asyncio.current_task()para aceleração de 4x-6x. (Contribuição de Itamar Oren e Pranav Thulasiram Bhat em gh-100344.)asyncio.iscoroutine()agora retornaFalsepara geradores, poisasyncionão tem suporte a corrotinas legadas baseadas em geradores. (Contribuição de Kumar Aditya em gh-102748.)asyncio.wait()easyncio.as_completed()agora aceita geradores que produzem tarefas. (Contribuição de Kumar Aditya em gh-78530.)
calendar¶
Adiciona enums
calendar.Monthecalendar.Daydefinindo meses do ano e dias da semana. (Contribuição de Prince Roshan em gh-103636.)
csv¶
Adiciona os sinalizadores
csv.QUOTE_NOTNULLecsv.QUOTE_STRINGSpara fornecer um controle mais refinado deNonee strings vazias por objetoscsv.writer.
dis¶
Opcodes de pseudo-instruções (que são usados pelo compilador, mas não aparecem no bytecode executável) agora são expostos no módulo
dis.HAVE_ARGUMENTainda é relevante para opcodes reais, mas não é útil para pseudo-instruções. Use a nova coleçãodis.hasarg. (Contribuição de Irit Katriel em gh-94216.)Adiciona a coleção
dis.hasexcpara indicar instruções que definem um manipulador de exceções. (Contribuição de Irit Katriel em gh-94216.)
fractions¶
Objetos do tipo
fractions.Fractionagora têm suporte a formatação estilo float. (Contribuição de Mark Dickinson em gh-100161.)
importlib.resources¶
importlib.resources.as_file()agora tem suporta a diretórios de recursos. (Contribuição de Jason R. Coombs em gh-97930.)Renomeia o primeiro parâmetro de
importlib.resources.files()para anchor. (Contribuição de Jason R. Coombs em gh-100598.)
inspect¶
Adiciona
inspect.markcoroutinefunction()para marcar funções de sincronização que retornam uma corrotina para uso cominspect.iscoroutinefunction(). (Contribuição de Carlton Gibson em gh-99247.)Adiciona
inspect.getasyncgenstate()einspect.getasyncgenlocals()para determinar o estado atual dos geradores assíncronos. (Contribuição de Thomas Krennwallner em gh-79940.)O desempenho de
inspect.getattr_static()foi consideravelmente melhorado. A maioria das chamadas para a função deve ser pelo menos 2x mais rápida do que no Python 3.11. (Contribuição de Alex Waygood em gh-103193.)
itertools¶
Adiciona
itertools.batched()para coletar tuplas de tamanhos iguais, onde o último lote pode ser menor que o resto. (Contribuição de Raymond Hettinger em gh-98363.)
math¶
Adiciona
math.sumprod()para calcular uma soma de produtos. (Contribuição de Raymond Hettinger em gh-100485.)Estende
math.nextafter()para incluir um argumento steps para subir ou descer várias etapas ao mesmo tempo. (Contribuição de Matthias Goergens, Mark Dickinson e Raymond Hettinger em gh-94906.)
os¶
Adiciona
os.PIDFD_NONBLOCKpara abrir um descritor de arquivo para um processo comos.pidfd_open()em modo sem bloqueio. (Contribuição de Kumar Aditya em gh-93312.)os.DirEntryagora inclui um métodoos.DirEntry.is_junction()para verificar se a entrada é uma junção. (Contribuição de Charles Machalow em gh-99547.)Adiciona funções
os.listdrives(),os.listvolumes()eos.listmounts()no Windows para enumerar unidades, volumes e pontos de montagem. (Contribuição de Steve Dower em gh-102519.)os.stat()eos.lstat()agora são mais precisos no Windows. O campost_birthtimeagora será preenchido com a hora de criação do arquivo, est_ctimefoi descontinuado, mas ainda contém a hora de criação (mas no futuro vai retornar a última alteração de metadados, para consistência com outras plataformas ).st_devpode ter até 64 bits est_inoaté 128 bits dependendo do seu sistema de arquivos, est_rdevé sempre definido como zero em vez de valores incorretos. Ambas as funções podem ser significativamente mais rápidas nas lançamentos mais recentes do Windows. (Contribuição de Steve Dower em gh-99726.)A partir da versão 3.12.4,
os.mkdir()eos.makedirs()no Windows agora suportam passar um valor mode de0o700para aplicar controle de acesso ao novo diretório. Isso afeta implicitamentetempfile.mkdtemp()e é uma mitigação para CVE 2024-4030. Outros valores para mode continuam sendo ignorados. (Contribuição de Steve Dower em gh-118486.)
os.path¶
Adiciona
os.path.isjunction()para verificar se um determinado caminho é uma junção. (Contribuição de Charles Machalow em gh-99547.)Adiciona
os.path.splitroot()para dividir um caminho em uma tríade(drive, root, tail). (Contribuição de Barney Gale em gh-101000.)
pathlib¶
Adiciona suporte para fazer subclasse de
pathlib.PurePathepathlib.Path, além de suas variantes específicas do Posix e do Windows. As subclasses podem substituir o métodopathlib.PurePath.with_segments()para passar informações entre instâncias de caminho.Adiciona
pathlib.Path.walk()para percorrer as árvores de diretórios e gerar todos os nomes de arquivos ou diretórios dentro delas, semelhante aos.walk(). (Contribuição de Stanislav Zmiev em gh-90385.)Adiciona o parâmetro opcional walk_up a
pathlib.PurePath.relative_to()para permitir a inserção de entradas..no resultado; este comportamento é mais consistente comos.path.relpath(). (Contribuição de Domenico Ragusa em gh-84538.)Adiciona
pathlib.Path.is_junction()como proxy paraos.path.isjunction(). (Contribuição de Charles Machalow em gh-99547.)Adiciona o parâmetro opcional case_sensitive a
pathlib.Path.glob(),pathlib.Path.rglob()epathlib.PurePath.match()para fazer correspondência com distinção entre maiúsculas e minúsculas do caminho, permitindo uma precisão mais precisa controle sobre o processo de correspondência.
platform¶
Adiciona suporte para detectar versões do Windows 11 e do Windows Server posteriores a 2012. Anteriormente, pesquisas em plataformas Windows Server mais recentes que o Windows Server 2012 e no Windows 11 retornariam
Windows-10. (Contribuição de Steve Dower em gh-89545.)
pdb¶
Adiciona variáveis de conveniência para armazenar valores temporariamente para a sessão de depuração e fornece acesso rápido a valores como o quadro atual ou o valor de retorno. (Contribuição de Tian Gao em gh-103693.)
random¶
Adiciona
random.binomialvariate(). (Contribuição de Raymond Hettinger em gh-81620.)Adiciona um padrão de
lambd=1.0arandom.expovariate(). (Contribuição de Raymond Hettinger em gh-100234.)
shutil¶
shutil.make_archive()agora passa o argumento root_dir para arquivadores personalizados que o suportam. Neste caso, ele não altera mais temporariamente o diretório de trabalho atual do processo para root_dir para realizar o arquivamento. (Contribuição de Serhiy Storchaka em gh-74696.)shutil.rmtree()agora aceita um novo argumento onexc que é um tratador de erros como onerror mas que espera uma instância de exceção em vez de um trio (typ, val, tb). onerror foi descontinuado. (Contribuição de Irit Katriel em gh-102828.)shutil. which()agora consulta a variável de ambiente PATHEXT para encontrar correspondências dentro de PATH no Windows mesmo quando o cmd fornecido inclui um componente de diretório. (Contribuição de Charles Machalow em gh-103179.)shutil. which()chamaráNeedCurrentDirectoryForExePathWao consultar executáveis no Windows para determinar se o diretório de trabalho atual deve ser anexado ao caminho de pesquisa. (Contribuição de Charles Machalow em gh-103179.)shutil.which()vai retornar um caminho que corresponde ao cmd com um componente dePATHEXTantes de uma correspondência direta em outro lugar no caminho de pesquisa no Windows. (Contribuição de Charles Machalow em gh-103179.)
sqlite3¶
Adiciona uma interface de linha de comando. (Contribuição de Erlend E. Aasland em gh-77617.)
Adiciona o atributo
sqlite3.Connection.autocommitasqlite3.Connectione o parâmetro autocommit asqlite3.connect()para controlar a PEP 249 compatível com tratamento de transação. (Contribuição de Erlend E. Aasland em gh-83638.)Adiciona o parâmetro somente-nomeado entrypoint a
sqlite3.Connection.load_extension(), para substituir o ponto de entrada da extensão SQLite. (Contribuição de Erlend E. Aasland em gh-103015.)Adiciona
sqlite3.Connection.getconfig()esqlite3.Connection.setconfig()asqlite3.Connectionpara fazer alterações na configuração de uma conexão de banco de dados. (Contribuição de Erlend E. Aasland em gh-103489.)
statistics¶
Estende
statistics.correlation()para incluir como um métodorankedpara calcular a correlação de Spearman de dados classificados. (Contribuição de Raymond Hettinger em gh-95861.)
sys¶
Adiciona o espaço de nomes
sys.monitoringpara expor a nova API de monitoramento PEP 669. (Contribuição de Mark Shannon em gh-103082.)Adiciona
sys.activate_stack_trampoline()esys.deactivate_stack_trampoline()para ativar e desativar trampolins do perfilador de pilha esys.is_stack_trampoline_active()para consultar se os trampolins do perfilador de pilha estão ativos. (Contribuição de Pablo Galindo e Christian Heimes com contribuições de Gregory P. Smith [Google] e Mark Shannon em gh-96123.)Adiciona
sys.last_excque contém a última exceção não tratada que foi levantada (para casos de uso de depuração post-mortem). Descontinuar os três campos que possuem as mesmas informações em seu formato legado:sys.last_type,sys.last_valueesys.last_traceback. (Contribuição de Irit Katriel em gh-102778.)sys._current_exceptions()agora retorna um mapeamento de thread-id para uma instância de exceção, ao invés de uma tupla(typ, exc, tb). (Contribuição de Irit Katriel em gh-103176.)sys.setrecursionlimit()esys.getrecursionlimit(). O limite de recursão agora se aplica apenas ao código Python. As funções integradas não usam o limite de recursão, mas são protegidas por um mecanismo diferente que evita que a recursão cause uma falha na máquina virtual.
tempfile¶
A função
tempfile.NamedTemporaryFiletem um novo parâmetro opcional delete_on_close (Contribuição de Evgeny Zorin em gh-58451.)tempfile.mkdtemp()agora sempre retorna um caminho absoluto, mesmo se o argumento fornecido para o parâmetro dir for um caminho relativo.A partir da versão 3.12.4 no Windows, o modo padrão
0o700usado portempfile.mkdtemp()agora limita o acesso ao novo diretório devido a alterações emos.mkdir(). Esta é uma mitigação para CVE 2024-4030. (Contribuição de Steve Dower em gh-118486.)
threading¶
Adiciona
threading.settrace_all_threads()ethreading.setprofile_all_threads()que permitem definir funções de rastreamento e criação de perfil em todos os threads em execução além do que está chamando. (Contribuição de Pablo Galindo em gh-93503.)
tkinter¶
tkinter.Canvas.coords()agora nivela seus argumentos. Agora ele aceita não apenas coordenadas como argumentos separados (x1, y1, x2, y2, ...) e uma sequência de coordenadas ([x1, y1, x2, y2, ...]) , mas também coordenadas agrupadas em pares ((x1, y1), (x2, y2), ...e[(x1, y1), (x2, y2), ...]) , como métodoscreate_*(). (Contribuição de Serhiy Storchaka em gh-94473.)
tokenize¶
O módulo
tokenizeinclui as mudanças introduzidas em PEP 701. (Contribuição de Marta Gómez Macías e Pablo Galindo em gh-102856.) Veja Portando para Python 3.12 para mais informações sobre as mudanças no módulotokenize.
types¶
Adiciona
types.get_original_bases()para permitir uma introspecção adicional de Tipos genéricos definidos pelo usuário quando subclassificado. (Contribuição de James Hilton-Balfe e Alex Waygood em gh-101827.)
typing¶
As verificações de
isinstance()comprotocolos verificáveis em tempo de execuçãoagora useinspect.getattr_static()em vez dehasattr()para verificar se existem atributos. Isso significa que descritores e métodos__getattr__()não são mais avaliados inesperadamente durante verificaçõesisinstance()em protocolos verificáveis em tempo de execução. No entanto, também pode significar que alguns objetos que costumavam ser considerados instâncias de um protocolo verificável em tempo de execução podem não ser mais considerados instâncias desse protocolo no Python 3.12+ e vice-versa. É improvável que a maioria dos usuários seja afetada por esta mudança. (Contribuição de Alex Waygood em gh-102433.)Os membros de um protocolo verificável em tempo de execução agora são considerados “congelados” em tempo de execução assim que a classe é criada. Fazer alterações dinâmicas em atributos em tempo de execução em um protocolo verificável em tempo de execução ainda vai funcionário, mas não terá impacto nas verificações de
isinstance()comparando objetos com o protocolo. Por exemplo:>>> from typing import Protocol, runtime_checkable >>> @runtime_checkable ... class TemX(Protocol): ... x = 1 ... >>> class Foo: ... ... >>> f = Foo() >>> isinstance(f, TemX) False >>> f.x = 1 >>> isinstance(f, TemX) True >>> HasX.y = 2 >>> isinstance(f, TemX) # inalterado, ainda que TemX agora tenha um atributo "y" True
Esta mudança foi feita para acelerar as verificações de
isinstance()em protocolos verificáveis em tempo de execução.O perfil de desempenho de verificações de
isinstance()comprotocolos verificáveis em tempo de execuçãomudou significativamente. A maioria das verificaçõesisinstance()a esses protocolos com apenas alguns membros devem ser pelo menos 2x mais rápidas que na versão 3.11, e algumas podem ser 20x mais rápidas ou mais. No entanto, as verificações deisinstance()em protocolos com muito mais membros podem ser mais lentas do que no Python 3.11. (Contribuição de Alex Waygood em gh-74690 e gh-103193.)Todas as classes
typing.TypedDictetyping.NamedTupleagora possuem o atributo__orig_bases__. (Contribuição de Adrian Garcia Badaracco em gh-103699.)Adiciona o parâmetro
frozen_defaultatyping.dataclass_transform(). (Contribuição de Erik De Bonte em gh-99957.)
unicodedata¶
O banco de dados Unicode foi atualizado para a versão 15.0.0. (Contribuição de Benjamin Peterson em gh-96734).
unittest¶
Adiciona uma opção de linha de comando --durations, mostrando os N casos de teste mais lentos:
python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s test_timeout (Lib.test.test_threading.BarrierTests)
1.003s test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s test_timeout (Lib.test.test_threading.EventTests)
(0.000 durations hidden. Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s
OK (skipped=3)
(Contribuição de Giampaolo Rodola em gh-48330)
uuid¶
Adiciona uma interface de linha de comando. (Contribuição de Adam Chhina em gh-88597.)
Otimizações¶
Remove os membros
wstrewstr_lengthdos objetos Unicode. Reduz o tamanho do objeto em 8 ou 16 bytes na plataforma de 64 bits. (PEP 623) (Contribuição de Inada Naoki em gh-92536.)Adiciona suporte experimental para usar o otimizador binário BOLT no processo de construção, o que melhora o desempenho de 1 a 5%. (Contribuição de Kevin Modzelewski em gh-90536 e ajuste de Donghee Na em gh-101525)
Acelera a substituição de expressões regulares (funções
re.sub()ere.subn()e métodosre.Patterncorrespondentes) para strings de substituição contendo referências de grupo em 2 ou 3 vezes . (Contribuição de Serhiy Storchaka em gh-91524.)Acelera a criação de
asyncio.Taskadiando a dispendiosa formatação de strings. (Contribuição de Itamar Oren em gh-103793.)As funções
tokenize.tokenize()etokenize.generate_tokens()são até 64% mais rápidas como efeito colateral das mudanças necessárias para cobrir PEP 701 no módulotokenize. (Contribuição de Marta Gómez Macías e Pablo Galindo em gh-102856.)Acelera chamadas de métodos
super()e carregamentos de atributos através da nova instruçãoLOAD_SUPER_ATTR. (Contribuição de Carl Meyer e Vladimir Matveev em gh-103497.)
Alterações de bytecode do CPython¶
Remove a instrução
LOAD_METHOD. Ela foi mesclada emLOAD_ATTR.LOAD_ATTRagora se comportará como a antiga instruçãoLOAD_METHODse o bit inferior de seu oparg estiver definido. (Contribuição de Ken Jin em gh-93429.)Remova as instruções
JUMP_IF_FALSE_OR_POPeJUMP_IF_TRUE_OR_POP. (Contribuição de Irit Katriel em gh-102859.)Remove a instrução
PRECALL. (Contribuição de Mark Shannon em gh-92925.)Adiciona as instruções
BINARY_SLICEeSTORE_SLICE. (Contribuição de Mark Shannon em gh-94163.)Adiciona as instruções
CALL_INTRINSIC_1. (Contribuição de Mark Shannon em gh-99005.)Adiciona a instrução
CALL_INTRINSIC_2. (Contribuição de Irit Katriel em gh-101799.)Adiciona a instrução
CLEANUP_THROW. (Contribuição de Brandt Bucher em gh-90997.)Adiciona a instrução
END_SEND. (Contribuição de Mark Shannon em gh-103082.)Adiciona a instrução
LOAD_FAST_AND_CLEARcomo parte da implementação de PEP 709. (Contribuição de Carl Meyer em gh-101441.)Adiciona a instrução
LOAD_FAST_CHECK. (Contribuição de Dennis Sweeney em gh-93143.)Adiciona os opcodes
LOAD_FROM_DICT_OR_DEREF,LOAD_FROM_DICT_OR_GLOBALSeLOAD_LOCALScomo parte da implementação da PEP 695. Remove o opcodeLOAD_CLASSDEREF, que pode ser substituído porLOAD_LOCALSmaisLOAD_FROM_DICT_OR_DEREF. (Contribuição de Jelle Zijlstra em gh-103764.)Adiciona a instrução
LOAD_SUPER_ATTR. (Contribuição de Carl Meyer e Vladimir Matveev em gh-103497.)Adiciona a instrução
RETURN_CONST. (Contribuição de Wenyang Wang em gh-101632.)
Ferramentas e daemons¶
Remove o diretório
Tools/demo/que continha scripts antigos de demonstração. Uma cópia pode ser encontrada no projeto old-demos. (Contribuição de Victor Stinner em gh-97681.)Remove scripts de exemplo desatualizados do diretório
Tools/scripts/. Uma cópia pode ser encontrada no projeto old-demos. (Contribuição de Victor Stinner em gh-97669.)
Descontinuados¶
argparse: Os parâmetros type, choices e metavar deargparse.BooleanOptionalActionforam descontinuados e serão removidos na versão 3.14. (Contribuição de Nikita Sobolev em gh-92248.)ast: Os seguintes recursosastforam descontinuados na documentação desde Python 3.8, agora fazem com que umDeprecationWarningseja emitido em tempo de execução quando eles são acessados ou usados, e serão removidos no Python 3.14:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Em vez disso, use
ast.Constant. (Contribuição de Serhiy Storchaka em gh-90953.)-
As classes filhas do observador
asyncio.MultiLoopChildWatcher,asyncio.FastChildWatcher,asyncio.AbstractChildWatchereasyncio.SafeChildWatcherforam descontinuadas e serão removidas no Python 3.14. (Contribuição de Kumar Aditya em gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()easyncio.AbstractEventLoopPolicy.get_child_watcher()foram descontinuados e serão removidos no Python 3.14. (Contribuição de Kumar Aditya em gh-94597.)O método
get_event_loop()da política de laço de eventos padrão agora emite umDeprecationWarningse não houver nenhum laço de eventos atual definido e decidir criar um. (Contribuição de Serhiy Storchaka e Guido van Rossum em gh-100160.)
calendar: as constantescalendar.Januaryecalendar.Februaryforam descontinuadas e substituídas porcalendar.JANUARYecalendar.FEBRUARY. (Contribuição de Prince Roshan em gh-103636.)collections.abc:collections.abc.ByteStringfoi descontinuado. PrefiraSequenceoucollections.abc.Buffer. Para uso em tipagem, prefira uma união, comobytes | bytearrayoucollections.abc.Buffer. (Contribuição de Shantanu Jain em gh-91896.)datetime:utcnow()eutcfromtimestamp()da classedatetime.datetimeforam descontinuados e serão removidos em uma versão futura. Em vez disso, use objetos conscientes do fuso horário para representar datas e horas em UTC: respectivamente, chamenow()efromtimestamp()com o parâmetro tz definido comodatetime.UTC. (Contribuição de Paul Ganssle em gh-103857.)email: Descontinua o parâmetro isdst ememail.utils.localtime(). (Contribuição de Alan Williams em gh-72346.)importlib.abc: Foram descontinuadas as seguintes classes, programadas para remoção no Python 3.14:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Em vez disso, use classes de
importlib.resources.abc:(Contribuição de Jason R. Coombs e Hugo van Kemenade em gh-93963.)
itertools: Descontinua o suporte para operações de cópia, deepcopy e pickle, que é não documentado, ineficiente, historicamente cheio de bugs e inconsistente. Isso será removido na versão 3.14 para uma redução significativa no volume de código e na carga de manutenção. (Contribuição de Raymond Hettinger em gh-101588.)multiprocessing: No Python 3.14, o método de início padrão demultiprocessingserá alterado para um mais seguro no Linux, BSDs e outras plataformas POSIX não-macOS onde'fork'é atualmente o padrão (gh-84559). Adicionar um aviso em tempo de execução sobre isso foi considerado muito perturbador, pois não se espera que a maior parte do código se importe. Use as APIsget_context()ouset_start_method()para especificar explicitamente quando seu código requer'fork'. Veja contextos e métodos de início.pkgutil:pkgutil.find_loader()epkgutil.get_loader()foram descontinuados e serão removidos no Python 3.14; useimportlib.util.find_spec()em vez disso. (Contribuição de Nikita Sobolev em gh-97850.)pty: O módulo tem duas funçõesmaster_open()eslave_open()não documentadas que foram descontinuados desde Python 2, mas só ganharam umDeprecationWarningadequado em 3.12. Remova-os em 3.14. (Contribuição de Soumendra Ganguly e Gregory P. Smith em gh-85984.)os:Os campos
st_ctimeretornados poros.stat()eos.lstat()no Windows foram descontinuados. Em um lançamento futuro, eles conterão o horário da última alteração de metadados, consistente com outras plataformas. Por enquanto, eles ainda contêm o horário de criação, que também está disponível no novo campost_birthtime. (Contribuição de Steve Dower em gh-99726.)Nas plataformas POSIX,
os.fork()agora pode levantar uma exceçãoDeprecationWarningquando puder detectar a chamada de um processo multithread. Sempre houve uma incompatibilidade fundamental com a plataforma POSIX ao fazer isso. Mesmo que esse código pareça funcionar. Adicionamos o aviso para aumentar a conscientização, pois os problemas encontrados pelo código ao fazer isso estão se tornando mais frequentes. Veja a documentaçãoos.fork()para mais detalhes junto com esta discussão sobre fork ser incompatível com threads para por que estamos agora trazendo à tona esse antigo problema de compatibilidade de plataforma para os desenvolvedores.
Quando este aviso aparece devido ao uso de
multiprocessingouconcurrent.futures, a correção é usar um método de início demultiprocessingdiferente, como"spawn"ou"forkserver".shutil: O argumento onerror deshutil.rmtree()foi descontinuado; use onexc em vez disso. (Contribuição de Irit Katriel em gh-102828.)-
adaptadores e conversores padrão agora foram descontinuados. Em vez disso, use Adapter and converter recipes e adapte-os às suas necessidades. (Contribuição de Erlend E. Aasland em gh-90016.)
Em
execute(),DeprecationWarningagora é emitida quando espaços reservados nomeados são usados junto com parâmetros fornecidos como sequência em vez de comodict. A partir do Python 3.14, usar espaços reservados nomeados com parâmetros fornecidos como uma sequência vai levantar umaProgrammingError. (Contribuição de Erlend E. Aasland em gh-101698.)
sys: Os campossys.last_type,sys.last_valueesys.last_tracebackforam descontinuados. Usesys.last_excem vez disso. (Contribuição de Irit Katriel em gh-102778.)tarfile: Extrair arquivos tar sem especificar filter foi descontinuado até Python 3.14, quando o filtro'data'se tornará o padrão. Veja Filtros de extração para detalhes.-
typing.Hashableetyping.Sized, apelidos foremcollections.abc.Hashableecollections.abc.Sizedrespectivamente, foram descontinuados. (gh-94309.)typing.ByteString, descontinuado desde Python 3.9, agora faz com que umDeprecationWarningseja emitida quando é usado. (Contribuição de Alex Waygood em gh-91896.)
xml.etree.ElementTree: O módulo agora emiteDeprecationWarningao testar o valor verdade de umxml.etree.ElementTree.Element. Antes, a implementação Python emitiaFutureWarning, e a implementação C não emitia nada. (Contribuição de Jacob Walls em gh-83122.)As assinaturas de 3 argumentos (tipo, valor, traceback) de
coroutine throw(),generator throw()easync generator throw()foram descontinuados e podem ser removidos em uma versão futura do Python. Use as versões de argumento único dessas funções. (Contribuição de Ofey Chan em gh-89874.)DeprecationWarningagora é levantada quando__package__em um módulo difere de__spec__.parent(anteriormente eraImportWarning). (Contribuição de Brett Cannon em gh-65961.)Definir
__package__ou__cached__em um módulo foi descontinuado e deixará de ser definido ou levado em consideração pelo sistema de importação no Python 3.14. (Contribuição de Brett Cannon em gh-65961.)O operador de inversão bit a bit (
~) em bool foi descontinuado. Isso levantará um erro no Python 3.16. Usenotpara negação lógica de bools. No raro caso em que você realmente precisa da inversão bit a bit dointsubjacente, converta para int explicitamente:~int(x). (Contribuição de Tim Hoffmann em gh-103487.)Acessar
co_lnotabem objetos de código foi descontinuado no Python 3.10 via PEP 626, mas só obteve umDeprecationWarningadequado em 3.12. Pode ser removido em 3.15. (Contribuição de Nikita Sobolev em gh-101866.)
Remoção pendente no Python 3.13¶
Módulos (veja PEP 594):
Outros módulos:
lib2to3e o programa 2to3 (gh-84540)
APIs:
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)Encadeamento do descritor de
classmethod(gh-89519)Métodos descontinuados de
importlib.resources:contents()is_resource()open_binary()open_text()path()read_binary()read_text()
Use
importlib.resources.files()em vez disso. Confira importlib-resources: Migrando do legado , em inglês (gh-106531)
Remoção pendente no Python 3.14¶
argparse: Os parâmetros type, choices e metavar deargparse.BooleanOptionalActionforam descontinuados e serão removidos na versão 3.14. (Contribuição de Nikita Sobolev em gh-92248.)ast: os seguintes recursos foram descontinuados na documentação desde Python 3.8, agora fazem com que umDeprecationWarningseja emitido em tempo de execução quando eles são acessados ou usados, e serão removidos no Python 3.14:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
Em vez disso, use
ast.Constant. (Contribuição de Serhiy Storchaka em gh-90953.)-
As classes filhas dos observadores
MultiLoopChildWatcher,FastChildWatcher,AbstractChildWatchereSafeChildWatcherforam descontinuadas e serão removidas no Python 3.14. (Contribuição de Kumar Aditya em gh-94597.)asyncio.set_child_watcher(),asyncio.get_child_watcher(),asyncio.AbstractEventLoopPolicy.set_child_watcher()easyncio.AbstractEventLoopPolicy.get_child_watcher()foram descontinuados e serão removidos no Python 3.14. (Contribuição de Kumar Aditya em gh-94597.)O método
get_event_loop()da política de laço de eventos padrão agora emite umDeprecationWarningse não houver nenhum laço de eventos atual definido e decidir criar um. (Contribuição de Serhiy Storchaka e Guido van Rossum em gh-100160.)
collections.abc:ByteStringfoi descontinuado. PrefiraSequenceouBufferPara uso em tipagem, prefira uma união, comobytes | bytearrayoucollections.abc.Buffer. (Contribuição de Shantanu Jain em gh-91896.)email: Descontinua o parâmetro isdst ememail.utils.localtime(). (Contribuição de Alan Williams em gh-72346.)importlib:__package__e__cached__deixarão de ser definidos ou levados em consideração pelo sistema de importação (gh-97879).importlib.abcdescontinuou as classes:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
Em vez disso, use classes de
importlib.resources.abc:(Contribuição de Jason R. Coombs e Hugo van Kemenade em gh-93963.)
itertoolstinha suporte não documentado, ineficiente, historicamente cheio de bugs e inconsistente para operações de cópia, cópia profunda e serialização com pickle. Isso será removido na versão 3.14 para uma redução significativa no volume de código e na carga de manutenção. (Contribuição de Raymond Hettinger em gh-101588.)multiprocessing: o método de inicialização padrão será alterado para um mais seguro no Linux, BSDs e outras plataformas POSIX não-macOS onde'fork'é atualmente o padrão (gh-84559). Adicionar um aviso de tempo de execução sobre isso foi considerado muito perturbador, pois não se espera que a maior parte do código se importe. Use as APIsget_context()ouset_start_method()para especificar explicitamente quando seu código requer'fork'. Veja Contextos e métodos de inicialização.pathlib:is_relative_to()erelative_to(): passar argumentos adicionais foi descontinuado.pkgutil:find_loader()eget_loader()agora levantamDeprecationWarning; useimportlib.util.find_spec(). (Contribuição de Nikita Sobolev em gh-97850.)pty:master_open(): usepty.openpty().slave_open(): usepty.openpty().
-
execute()eexecutemany()se espaços reservados nomeados forem usados e parameters for uma sequência em vez de umdict.
typing:ByteString, descontinuado desde Python 3.9, agora faz com que umaDeprecationWarningseja emitida quando é usado.urllib:urllib.parse.Quoterestá obsoleto: não foi planejado para ser uma API pública. (Contribuição de Gregory P. Smith em gh-88168.)
Remoção pendente no Python 3.15¶
http.server.CGIHTTPRequestHandlerserá removido junto com seu sinalizador relacionado--cgiparapython -m http.server. Estava descontinuado e raramente usado. Não existe substituição direta. Qualquer coisa é melhor que CGI para fazer a interface de um servidor web com um manipulador de solicitações.-
Método
load_module(): useexec_module().
locale:locale.getdefaultlocale()foi descontinuada no Python 3.11 e originalmente planejada para remoção no Python 3.13 (gh-90817), mas a remoção foi adiada para o Python 3.15. Uselocale.setlocale(),locale.getencoding()elocale.getlocale()em vez disso. (Contribuição de Hugo van Kemenade em gh-111187.)pathlib:pathlib.PurePath.is_reserved()está descontinuado e programado para remoção no Python 3.15. Do Python 3.13 em diante, useos.path.isreservedpara detectar caminhos reservados no Windows.platform:java_ver()está descontinuada e será removida na versão 3.15. Ela não foi testada em grande parte, tinha uma API confusa e só era útil para suporte a Jython. (Contribuição de Nikita Sobolev em gh-116349.)-
O argumento check_home de
sysconfig.is_python_build()foi descontinuado desde o Python 3.12.
threading: Passar qualquer argumento parathreading.RLock()agora está descontinuado. A versão C permite qualquer número de args e kwargs, mas eles são simplesmente ignorados. A versão Python não permite nenhum argumento. Todos os argumentos serão removidos dethreading.RLock()no Python 3.15. (Contribuição de Nikita Sobolev em gh-102029.)-
A sintaxe de argumento nomeado não documentada para criar classes
NamedTuple(NT = NamedTuple("NT", x=int)) está descontinuada e não será permitida em 3.15. Use a sintaxe baseada em classe ou a sintaxe funcional.
-
types.CodeType: o acesso aco_lnotabfoi descontinuado na PEP 626 desde 3.10 e foi planejado para ser removido em 3.12, mas só recebeu umaDeprecationWarningadequada em 3.12. Pode ser removido em 3.15. (Contribuição de Nikita Sobolev em gh-101866.)
-
Ao usar a sintaxe funcional para criar uma classe
NamedTuple, falhar ao passar um valor para o parâmetro fields (NT = NamedTuple("NT")) está descontinuada. PassarNonepara o parâmetro fields (NT = NamedTuple("NT", None)) também está descontinuada. Ambos não serão permitidos no Python 3.15. Para criar uma classeNamedTuplecom 0 campos, useclass NT(NamedTuple): passouNT = NamedTuple("NT", []).
typing.TypedDict: Ao usar a sintaxe funcional para criar uma classeTypedDict, falhar ao passar um valor para o parâmetro fields (TD = TypedDict("TD")) está descontinuada. PassarNonepara o parâmetro fields (TD = TypedDict("TD", None)) também está descontinuada. Ambos não serão permitidos no Python 3.15. Para criar uma classeTypedDictcom 0 campos, useclass TD(TypedDict): passouTD = TypedDict("TD", {}).wave: Descontinua os métodosgetmark(),setmark()egetmarkers()das classeswave.Wave_readewave.Wave_write. Eles serão removidos no Python 3.15. (Contribuição de Victor Stinner em gh-105096.)
Remoção pendente no Python 3.16¶
O sistema de importação:
A definição de
__loader__em um módulo enquanto falha na definição de__spec__.loaderestá descontinuado. No Python 3.16,__loader__deixará de ser definido ou levado em consideração pelo sistema de importação ou pela biblioteca padrão.
array:array.array: tipo'u'(wchar_t): use o tipo'w'(Py_UCS4).builtins:~bool, inversão bit a bit em booleanos.symtable: Descontinuasymtable.Class.get_methods()por falta de interesse. (Contribuição de Bénédikt Tran em gh-119698.)
Remoção pendente em versões futuras¶
As APIs a seguir serão removidas no futuro, embora atualmente não haja uma data agendada para sua remoção.
argparse: o aninhamento de grupos de argumentos e o aninhamento de grupos mutuamente exclusivos estão descontinuados.-
bool(NotImplemented).Geradores: a assinatura
throw(type, exc, tb)eathrow(type, exc, tb)está descontinuada: usethrow(exc)eathrow(exc), a assinatura do argumento único.Atualmente Python aceita literais numéricos imediatamente seguidos por palavras reservadas como, por exemplo,
0in x,1or x,0if 1else 2. Ele permite expressões confusas e ambíguas como[0x1for x in y](que pode ser interpretada como[0x1 for x in y]ou[0x1f or x in y]). Um aviso de sintaxe é levantado se o literal numérico for imediatamente seguido por uma das palavras reservadasand,else,for,if,in,iseor. Em uma versão futura, será alterado para um erro de sintaxe. (gh-87999)Suporte para métodos
__index__()e__int__()retornando tipo não-int: esses métodos serão necessários para retornar uma instância de uma subclasse estrita deint.Suporte para o método
__float__()retornando uma subclasse estrita defloat: esses métodos serão necessários para retornar uma instância defloat.Suporte para o método
__complex__()retornando uma subclasse estrita decomplex: esses métodos serão necessários para retornar uma instância decomplex.Delegação do método
int()para o__trunc__().Passar um número complexo como argumento real ou imag no construtor
complex()agora está descontinuado; deve ser passado apenas como um único argumento posicional. (Contribuição de Serhiy Storchaka em gh-109218.)
calendar: as constantescalendar.Januaryecalendar.Februaryforam descontinuadas e substituídas porcalendar.JANUARYecalendar.FEBRUARY. (Contribuição de Prince Roshan em gh-103636.)codeobject.co_lnotab: use o métodocodeobject.co_lines().-
utcnow(): usedatetime.datetime.now(tz=datetime.UTC).utcfromtimestamp(): usedatetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).
gettext: o valor de plural deve ser um número inteiro.-
O parâmetro debug_override de
cache_from_source()foi descontinuado: use o parâmetro optimization.
-
Interface de tupla
EntryPoints.Noneimplícito nos valores de retorno.
mailbox: o uso da entrada StringIO e do modo de texto foi descontinuado; em vez disso, use BytesIO e o modo binário.os: chameos.register_at_fork()em processo multithread.pydoc.ErrorDuringImport: um valor de tupla para o parâmetro exc_info foi descontinuado, use uma instância de exceção.re: regras mais rigorosas agora são aplicadas para referências numéricas de grupos e nomes de grupos em expressões regulares. Apenas a sequência de dígitos ASCII agora é aceita como referência numérica. O nome do grupo em padrões de bytes e strings de substituição agora pode conter apenas letras e dígitos ASCII e sublinhado. (Contribuição de Serhiy Storchaka em gh-91760.)Módulos
sre_compile,sre_constantsesre_parse.shutil: o parâmetro onerror dermtree()foi descontinuado no Python 3.12; use o parâmetro onexc.Protocolos e opções de
sslssl.SSLContextsem argumento de protocolo foi descontinuado.ssl.SSLContext:set_npn_protocols()eselected_npn_protocol()foram descontinuados, use ALPN.Opções de
ssl.OP_NO_SSL*Opções de
ssl.OP_NO_TLS*ssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
Métodos de
threading:threading.Condition.notifyAll(): usenotify_all().threading.Event.isSet(): useis_set().threading.Thread.isDaemon(),threading.Thread.setDaemon(): use o atributothreading.Thread.daemon.threading.Thread.getName(),threading.Thread.setName(): use o atributothreading.Thread.name.threading.currentThread(): usethreading.current_thread().threading.activeCount(): usethreading.active_count().
unittest.IsolatedAsyncioTestCase: foi descontinuado retornar um valor que não sejaNonede um caso de teste.Funções descontinuadas de
urllib.parse: useurlparse()splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
urllib.request: o estilo deURLopenereFancyURLopenerde invocar solicitações foi descontinuado. Use as mais novas funções e métodosurlopen().wsgiref:SimpleHandler.stdout.write()não deve fazer gravações parciais.xml.etree.ElementTree: testar o valor verdade de umElementestá descontinuado. Em um lançamento futuro isso sempre retornaráTrue. Em vez disso, prefira os testes explícitoslen(elem)ouelem is not None.zipimport.zipimporter.load_module()foi descontinuado: useexec_module().
Removidos¶
asynchat e asyncore¶
configparser¶
Vários nomes descontinuados no
configparserna versão 3.2 foram removidos por gh-89336:configparser.ParsingErrornão possui mais um argumento ou atributofilename. Use o atributo e o argumentosource.configparsernão possui mais uma classeSafeConfigParser. Use o nomeConfigParsermais curto.configparser.ConfigParsernão possui mais um métodoreadfp. Useread_file()em vez disso.
distutils¶
Remove o pacote
distutils. Foi descontinuado no Python 3.10 por PEP 632 “Descontinuar o módulo distutils”. Para projetos que ainda usamdistutilse não podem ser atualizados para outra coisa, o projetosetuptoolspode ser instalado: ele ainda fornecedistutils. (Contribuição de Victor Stinner em gh-92584.)
ensurepip¶
Remove o wheel de setuptools incluído em
ensurepipe para de instalar setuptools em ambientes criados porvenv.pip (>= 22.1)não requer que setuptools sejam instalados no ambiente. Pacotes baseados emsetuptools(e baseados emdistutils) ainda podem ser usados compip install, já que o pip fornecerásetuptoolsno ambiente de construção que ele usa para construir um pacote.easy_install,pkg_resources,setuptoolsedistutilsnão são mais fornecidos por padrão em ambientes criados comvenvou inicializados comensurepip, já que eles são parte do pacotesetuptools. Para projetos que dependem destes em tempo de execução, o projetosetuptoolsdeve ser declarado como uma dependência e instalado separadamente (normalmente, usando pip).(Contribuição de Pradyun Gedam em gh-95299.)
enum¶
ftplib¶
gzip¶
Remove o atributo
filenamedogzip.GzipFiledegzip, descontinuado desde Python 2.6, use o atributonameem seu lugar. No modo de gravação, o atributofilenameadicionou a extensão de arquivo'.gz'se ela não estivesse presente. (Contribuição de Victor Stinner em gh-94196.)
hashlib¶
Remove a implementação Python pura de
hashlib.pbkdf2_hmac()dehashlib, descontinuado em Python 3.10. Python 3.10 e mais recente requer OpenSSL 1.1.1 (PEP 644): esta versão do OpenSSL fornece uma implementação C depbkdf2_hmac()que é mais rápida. (Contribuição de Victor Stinner em gh-94199.)
importlib¶
Foi concluída a remoção de muitos alvos de
importlibque haviam sido descontinuados anteriormente:Referências e suporte a
module_repr()foram removidos. (Contribuição de Barry Warsaw em gh-97850.)importlib.util.set_package,importlib.util.set_loadereimportlib.util.module_for_loaderforam todos removidos. (Contribuição de Brett Cannon e Nikita Sobolev em gh-65961 e gh-97850.)O suporte para APIs
find_loader()efind_module()foi removido. (Contribuição de Barry Warsaw em gh-98040.)importlib.abc.Finder,pkgutil.ImpImporterepkgutil.ImpLoaderforam removidos. (Contribuição de Barry Warsaw em gh-98040.)
imp¶
O módulo
impfoi removido. (Contribuição de Barry Warsaw em gh-98040.)Para migrar consulte a seguinte tabela de correspondência:
imp
importlib
imp.NullImporterInsere
Noneemsys.path_importer_cacheimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES,importlib.machinery.EXTENSION_SUFFIXESeimportlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.source_from_cache()imp.load_source()Veja abaixo
Substitua
imp.load_source()com:import importlib.util import importlib.machinery def load_source(modname, filename): loader = importlib.machinery.SourceFileLoader(modname, filename) spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) module = importlib.util.module_from_spec(spec) # O módulo é sempre executado e não colocado em cache em sys.modules. # Descomente a linha a seguir para colocar o módulo em cache. # sys.modules[module.__name__] = module loader.exec_module(module) return module
Remove funções e atributos do
impsem substituições:Funções não documentadas:
imp.init_builtin()imp.load_compiled()imp.load_dynamic()imp.load_package()
imp.lock_held(),imp.acquire_lock(),imp.release_lock(): o esquema de trava foi alterado no Python 3.3 para travas por módulo.Constantes de
imp.find_module():SEARCH_ERROR,PY_SOURCE,PY_COMPILED,C_EXTENSION,PY_RESOURCE,PKG_DIRECTORY,C_BUILTIN,PY_FROZEN,PY_CODERESOURCE,IMP_HOOK.
io¶
locale¶
Remove a função
locale.format()delocale, descontinuada no Python 3.7: uselocale.format_string()em seu lugar. (Contribuição de Victor Stinner em gh-94226.)
smtpd¶
sqlite3¶
Os seguintes recursos não documentados do
sqlite3, descontinuados no Python 3.10, foram agora removidos:sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
Se um cache compartilhado deve ser usado, abra o banco de dados no modo URI usando o parâmetro de consulta
cache=shared.A fábrica de texto
sqlite3.OptimizedUnicodetem sido um apelido parastrdesde Python 3.3. O código que anteriormente definiu a fábrica de texto comoOptimizedUnicodepode usarstrexplicitamente ou confiar no valor padrão que também éstr.(Contribuição de Erlend E. Aasland em gh-92548.)
ssl¶
Remove a função
ssl.RAND_pseudo_bytes()dossl, descontinuada no Python 3.6: useos.urandom()oussl.RAND_bytes()em seu lugar. (Contribuição de Victor Stinner em gh-94199.)Remove a função
ssl.match_hostname(). Foi descontinuada no Python 3.7. OpenSSL realiza correspondência de nome de host desde Python 3.7, Python não usa mais a funçãossl.match_hostname(). (Contribuição de Victor Stinner em gh-94199.)Remove a função
ssl.wrap_socket(), descontinuada no Python 3.7: em vez desta, crie um objetossl.SSLContexte chame seu métodossl.SSLContext.wrap_socket. Qualquer pacote que ainda usessl.wrap_socket()está quebrado e é inseguro. A função não envia uma extensão SNI TLS nem valida o nome do host do servidor. O código está sujeito a CWE 295 (validação inadequada de certificado). (Contribuição de Victor Stinner em gh-94199.)
unittest¶
Remove recursos do
unittesthá muito tempo descontinuados:Vários apelidos de método de
TestCase:Apelido descontinuado
Método
Descontinuado em
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.5
Você pode usar https://github.com/isidentical/teyit para modernizar automaticamente seus testes de unidade.
Método não documentado e quebrado
assertDictContainsSubsetdeTestCase(descontinuado no Python 3.2).Parâmetro não documentado use_load_tests de
TestLoader.loadTestsFromModule(descontinuado e ignorado desde Python 3.5).Um apelido da classe
TextTestResult:_TextTestResult(descontinuado no Python 3.2).
(Contribuição de Serhiy Storchaka em gh-89325.)
webbrowser¶
Remove o suporte para navegadores descontinuados de
webbrowser. Os navegadores removidos incluem: Grail, Mosaic, Netscape, Galeon, Skipstone, Iceape, Firebird e Firefox versões 35 e inferiores (gh-102871).
xml.etree.ElementTree¶
Remove o método
ElementTree.Element.copy()da implementação Python pura, descontinuado no Python 3.10; use a funçãocopy.copy()em seu lugar. A implementação C dexml.etree.ElementTreenão possui nenhum métodocopy(), apenas um método__copy__(). (Contribuição de Victor Stinner em gh-94383.)
zipimport¶
Outros¶
Remove a regra
suspiciousdoMakefileda documentação e doDoc/tools/rstlint.py, ambas em favor do sphinx-lint. (Contribuição de Julien Palard em gh-98179.)Remove os parâmetros keyfile e certfile dos módulos
ftplib,imaplib,poplibesmtplib, e dos módulos key_file, cert_file e check_hostname do módulohttp.client, todos descontinuados desde Python 3.6. Use o parâmetro context (ssl_context emimaplib). (Contribuição de Victor Stinner em gh-94172.)Remove hacks de compatibilidade
Jythonde vários módulos e testes da stdlib. (Contribuição de Nikita Sobolev em gh-99482.)Remove o sinalizador
_use_broken_old_ctypes_structure_semantics_do móduloctypes. (Contribuição de Nikita Sobolev em gh-99285.)
Portando para Python 3.12¶
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¶
Regras mais rigorosas agora são aplicadas para referências numéricas de grupos e nomes de grupos em expressões regulares. Apenas a sequência de dígitos ASCII agora é aceita como referência numérica. O nome do grupo em padrões de bytes e strings de substituição agora pode conter apenas letras e dígitos ASCII e sublinhado. (Contribuição de Serhiy Storchaka em gh-91760.)
Remove a funcionalidade
randrange()descontinuada desde o Python 3.10. Anteriormente,randrange(10.0)era convertido sem perdas pararandrange(10). Agora, ele levanta umTypeError. Além disso, a exceção levantada para valores não inteiros comorandrange(10.5)ourandrange('10')foi alterada deValueErrorparaTypeError. Isso também evita bugs onderandrange(1e25)selecionaria silenciosamente um intervalo maior querandrange(10**25). (Originalmente sugerido por Serhiy Storchaka gh-86388.)argparse.ArgumentParseralterou a codificação e o tratador de erros para ler argumentos do arquivo (por exemplo, opçãofromfile_prefix_chars) da codificação de texto padrão (por exemplo,locale.getpreferredencoding(False)) para tratador de erros e codificação do sistema de arquivos. Os arquivos de argumento devem ser codificados em UTF-8 em vez de ANSI Codepage no Windows.Remove o módulo
smtpdbaseado emasyncoredescontinuado no Python 3.4.7 e 3.5.4. Um substituto recomendado é o módulo PyPI baseado emasyncioaiosmtpd.shlex.split(): PassarNonepara o argumento s agora levanta uma exceção, ao invés de lersys.stdin. O recurso foi descontinuado no Python 3.9. (Contribuição de Victor Stinner em gh-94352.)O módulo
osnão aceita mais caminhos bytes ou similar, como os tiposbytearrayememoryview: apenas o tipo exatobytesé aceito para strings de bytes. (Contribuição de Victor Stinner em gh-98393.)syslog.openlog()esyslog.closelog()agora falham se usadas em subinterpretadores.syslog.syslog()ainda pode ser usada em subinterpretadores, mas agora somente sesyslog.openlog()já tiver sido chamada no interpretador principal. Estas novas restrições não se aplicam ao interpretador principal, então apenas um pequeno grupo de usuários poderá ser afetado. Essa mudança ajuda no isolamento do interpretador. Além disso,syslogé um wrapper em torno de recursos globais de processo, que são melhor gerenciados a partir do interpretador principal. (Contribuição de Donghee Na em gh-99127.)O comportamento não documentado de trava de
cached_property()foi removido, porque travava todas as instâncias da classe, levando a uma alta contenção de trava. Isso significa que uma função getter de propriedade em cache agora pode ser executada mais de uma vez para uma única instância, se duas threads competirem. Para a maioria das propriedades simples em cache (por exemplo, aquelas que são idempotentes e simplesmente calculam um valor com base em outros atributos da instância), isso será suficiente. Se a sincronização for necessária, implemente a trava na função getter de propriedade em cache ou em torno de pontos de acesso multithread.sys._current_exceptions()agora retorna um mapeamento de thread-id para uma instância de exceção, ao invés de uma tupla(typ, exc, tb). (Contribuição de Irit Katriel em gh-103176.)Ao extrair arquivos tar usando
tarfileoushutil.unpack_archive(), passe o argumento filter para limitar recursos que podem surpreender ou ser perigosos. Veja Filtros de extração para detalhes.A saída das funções
tokenize.tokenize()etokenize.generate_tokens()agora foi alterada devido às mudanças introduzidas na PEP 701. Isso significa que os tokensSTRINGnão são mais emitidos para f-strings e os tokens descritos em PEP 701 agora são produzidos:FSTRING_START,FSTRING_MIDDLEeFSTRING_ENDagora são emitidos para partes “string” de f-strings, além dos tokens apropriados para a tokenização nos componentes da expressão. Por exemplo, para a f-stringf"start {1+1} end"a versão antiga do tokenizer emitida:1,0-1,18: STRING 'f"start {1+1} end"'
enquanto a nova versão emite:
1,0-1,2: FSTRING_START 'f"' 1,2-1,8: FSTRING_MIDDLE 'start ' 1,8-1,9: OP '{' 1,9-1,10: NUMBER '1' 1,10-1,11: OP '+' 1,11-1,12: NUMBER '1' 1,12-1,13: OP '}' 1,13-1,17: FSTRING_MIDDLE ' end' 1,17-1,18: FSTRING_END '"'
Além disso, pode haver algumas pequenas alterações comportamentais como consequência das alterações necessárias para oferecer suporte à PEP 701. Algumas dessas mudanças incluem:
O atributo
typedos tokens emitidos ao tokenizar alguns caracteres Python inválidos, como!, mudou deERRORTOKENparaOP.Strings incompletas de linha única agora também levantam
tokenize.TokenErrorcomo fazem strings multilinhas incompletas.Algum código Python incompleto ou inválido agora levanta
tokenize.TokenErrorem vez de retornar tokensERRORTOKENarbitrários ao tokenizá-lo.Misturar tabulações e espaços como indentação no mesmo arquivo não é mais suportado e vai levantar uma
TabError.
O módulo
threadingagora espera que o módulo_threadtenha um atributo_is_main_interpreter. É uma função sem argumentos que retornaTruese o interpretador atual for o interpretador principal.Qualquer biblioteca ou aplicação que forneça um módulo
_threadpersonalizado deve fornecer_is_main_interpreter(). (Veja gh-112826.)
Mudanças na construção¶
Python não usa mais
setup.pypara construir módulos de extensão C compartilhados. Parâmetros de construção como cabeçalhos e bibliotecas são detectados no scriptconfigure. As extensões são construídas porMakefile. A maioria das extensões usapkg-confige recorre à detecção manual. (Contribuição de Christian Heimes em gh-93939.)va_start()com dois parâmetros, comova_start(args, format), agora é necessário para construir Python.va_start()não é mais chamado com um único parâmetro. (Contribuição de Kumar Aditya em gh-93207.)CPython agora usa a opção ThinLTO como política de otimização de tempo de vincualção padrão se o compilador Clang aceitar o sinalizador. (Contribuição de Donghee Na em gh-89536.)
Adiciona a variável
COMPILEALL_OPTSemMakefilepara substituir as opçõescompileall(padrão:-j0) emmake install. Também fundiu os 3 comandoscompileallem um único comando para construir arquivos .pyc para todos os níveis de otimização (0, 1, 2) de uma só vez. (Contribuição de Victor Stinner em gh-99289.)Adiciona trios de plataforma para LoongArch de 64 bits:
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(Contribuição de Zhang Na em gh-90656.)
PYTHON_FOR_REGENagora requer Python 3.10 ou mais novo.Autoconf 2.71 e aclocal 1.16.4 agora são necessários para regerar
!configure. (Contribuição de Christian Heimes em gh-89886.)Construções do Windows e instaladores do macOS em python.org agora usam OpenSSL 3.0.
Alterações na API C¶
Novas funcionalidades¶
PEP 697: Introduz o tier de API C Instável, destinada a ferramentas de baixo nível como depuradores e compiladores JIT. Esta API pode mudar em cada versão secundária do CPython sem avisos de descontinuação. Seu conteúdo é marcado pelo prefixo
PyUnstable_nos nomes.Construtores de objeto código:
PyUnstable_Code_New()(renomeado dePyCode_New)PyUnstable_Code_NewWithPosOnlyArgs()(renomeado dePyCode_NewWithPosOnlyArgs)
Armazenamento extra para objetos código (PEP 523):
PyUnstable_Eval_RequestCodeExtraIndex()(renomeado de_PyEval_RequestCodeExtraIndex)PyUnstable_Code_GetExtra()(renomeado de_PyCode_GetExtra)PyUnstable_Code_SetExtra()(renomeado de_PyCode_SetExtra)
Os nomes originais continuarão disponíveis até que a respectiva API seja alterada.
(Contribuição de Petr Viktorin em gh-101101.)
PEP 697: Adiciona uma API para estender tipos cujo layout de memória de instância é opaco:
PyType_Spec.basicsizepode ser zero ou negativo para especificar a herança ou extensão do tamanho da classe base.PyObject_GetTypeData()ePyType_GetTypeDataSize()adicionadas para permitir acesso a dados de instância específicos da subclasse.Py_TPFLAGS_ITEMS_AT_ENDePyObject_GetItemData()adicionadas para permitir a extensão segura de certos tipos de tamanho variável, incluindoPyType_Type.Py_RELATIVE_OFFSETadicionada para permitir a definição demembrosem termos de uma estrutura específica da subclasse.
(Contribuição de Petr Viktorin em gh-103509.)
Adiciona à API C limitada a nova função
PyType_FromMetaclass(), que generaliza aPyType_FromModuleAndSpec()existente usando um argumento de metaclasse adicional. (Contribuição de Wenzel Jakob em gh-93012.)API para criação de objetos que podem ser chamados usando o protocolo vectorcall foi adicionada à API Limitada:
O sinalizador
Py_TPFLAGS_HAVE_VECTORCALLagora é removido de uma classe quando o método__call__()da classe é reatribuído. Isso torna vectorcall seguro para uso com tipos mutáveis (ou seja, tipos de heap sem o sinalizador imutável,Py_TPFLAGS_IMMUTABLETYPE). Tipos mutáveis que não substituemtp_callagora herdam o sinalizadorPy_TPFLAGS_HAVE_VECTORCALL. (Contribuição de Petr Viktorin em gh-93274.)Os sinalizadores
Py_TPFLAGS_MANAGED_DICTePy_TPFLAGS_MANAGED_WEAKREFforam adicionados. Isso permite que as classes de extensões ofereçam suporte a objetos__dict__e weakrefs com menos trabalho, usando menos memória e com acesso mais rápido.API para realizar chamadas usando o protocolo vectorcall foi adicionada à API Limitada:
Isto significa que ambas as extremidades de entrada e saída do protocolo de chamada vetorial estão agora disponíveis na API Limitada. (Contribuição de Wenzel Jakob em gh-98586.)
Adiciona duas novas funções públicas,
PyEval_SetProfileAllThreads()ePyEval_SetTraceAllThreads(), que permitem definir funções de rastreamento e perfilação em todos os threads em execução, além do de chamada. (Contribuição de Pablo Galindo em gh-93503.)Adiciona a nova função
PyFunction_SetVectorcall()à API C que define o campo vectorcall de um determinadoPyFunctionObject. (Contribuição de Andrew Frost em gh-92257.)A API C agora permite registrar funções de retorno de chamada via
PyDict_AddWatcher(),PyDict_Watch()e APIs relacionadas a serem chamadas sempre que um dicionário é modificado. Destina-se a ser usado para otimizar interpretadores, compiladores JIT ou depuradores. (Contribuição de Carl Meyer em gh-91052.)Adiciona a API
PyType_AddWatcher()ePyType_Watch()para registrar retornos de chamada para receber notificações sobre alterações em um tipo. (Contribuição de Carl Meyer em gh-91051.)Adiciona APIs
PyCode_AddWatcher()ePyCode_ClearWatcher()para registrar retornos de chamada para receber notificação sobre criação e destruição de objetos de código. (Contribuição de Itamar Oren em gh-91054.)Adiciona as funções
PyFrame_GetVar()ePyFrame_GetVarString()para obter uma variável de quadro por seu nome. (Contribuição de Victor Stinner em gh-91248.)Adiciona
PyErr_GetRaisedException()ePyErr_SetRaisedException()para salvar e restaurar a exceção atual. Essas funções retornam e aceitam um único objeto de exceção, em vez dos argumentos triplos dos agora obsoletosPyErr_Fetch()ePyErr_Restore(). Isso é menos sujeito a erros e um pouco mais eficiente. (Contribuição de Mark Shannon em gh-101578.)Adiciona
_PyErr_ChainExceptions1, que usa uma instância de exceção, para substituir a API legada_PyErr_ChainExceptions, que agora foi descontinuada. (Contribuição de Mark Shannon em gh-101578.)Adiciona
PyException_GetArgs()ePyException_SetArgs()como funções de conveniência para recuperar e modificar oargspassado para o construtor da exceção. (Contribuição de Mark Shannon em gh-101578.)Adiciona
PyErr_DisplayException(), que usa uma instância de exceção, para substituir a API legadaPyErr_Display(). (Contribuição de Irit Katriel em gh-102755).
PEP 683: Introduz Objetos Imortais, que permite que objetos ignorem contagens de referências e alterações relacionadas à API C:
_Py_IMMORTAL_REFCNT: A contagem de referências que define um objetocomo imortal.
_Py_IsImmortalVerifica se um objeto possui a contagem de referências imortal.PyObject_HEAD_INITIsso agora inicializará a contagem de referências para_Py_IMMORTAL_REFCNTquando usado comPy_BUILD_CORE.
SSTATE_INTERNED_IMMORTALUm identificador para objetos unicode internalizadosque são imortais.
SSTATE_INTERNED_IMMORTAL_STATICUm identificador para unicode internalizadoobjetos que são imortais e estáticos
sys.getunicodeinternedsizeIsso retorna o número total de unicodeobjetos que foram internalizados. Isso agora é necessário para
refleak.pyrastrear corretamente contagens de referências e blocos alocados
(Contribuição de Eddie Elizondo em gh-84436.)
PEP 684: Adiciona a nova função
Py_NewInterpreterFromConfig()ePyInterpreterConfig, que podem ser usadas para criar subinterpretadores com suas próprias GILs. (Veja PEP 684: Uma GIL por interpretador para mais informações.) (Contribuição de Eric Snow em gh-104110.)Na API C limitada versão 3.12, as funções
Py_INCREF()ePy_DECREF()agora são implementadas como chamadas de função opacas para ocultar detalhes de implementação. (Contribuição de Victor Stinner em gh-105387.)
Portando para Python 3.12¶
APIs Unicode legadas baseadas na representação de
Py_UNICODE*foram removidas. Migre para APIs baseadas em UTF-8 ouwchar_t*.Funções de análise de argumentos como
PyArg_ParseTuple()não mais oferecem suporte a formato baseado emPy_UNICODE*(por exemplo,u,Z). Migre para outros formatos para Unicode comos,z,eseU.tp_weaklistpara todos os tipos embutidos estáticos é sempreNULL. Este é um campo somente interno emPyTypeObject, mas estamos apontando a mudança caso alguém acesse o campo diretamente de qualquer maneira. Para evitar quebras, considere usar a API C pública existente ou, se necessário, a macro_PyObject_GET_WEAKREFS_LISTPTR()(somente interna).Este
PyTypeObject.tp_subclassessomente interno pode agora não ser um ponteiro de objeto válido. Seu tipo foi alterado para void* para refletir isso. Mencionamos isso caso alguém esteja acessando diretamente o campo somente interno.Para obter uma lista de subclasses, chame o método Python
__subclasses__()(usandoPyObject_CallMethod(), por exemplo).Adicionado suporte para mais opções de formatação (alinhamento à esquerda, octais, hexadecimais maiúsculos,
intmax_t,ptrdiff_t,wchar_tstrings C, largura variável e precisão) emPyUnicode_FromFormat()ePyUnicode_FromFormatV(). (Contribuição de Serhiy Storchaka em gh-98836.)Um caractere de formato não reconhecido em
PyUnicode_FromFormat()ePyUnicode_FromFormatV()agora define umSystemError. Nas versões anteriores, fazia com que todo o restante da string de formato fosse copiado como estava para a string de resultado e quaisquer argumentos extras descartados. (Contribuição de Serhiy Storchaka em gh-95781.)Corrige o posicionamento incorreto do sinal em
PyUnicode_FromFormat()ePyUnicode_FromFormatV(). (Contribuição de Philip Georgi em gh-95504.)Classes de extensão que desejam adicionar um
__dict__ou slot de referência fraca devem usarPy_TPFLAGS_MANAGED_DICTePy_TPFLAGS_MANAGED_WEAKREFem vez detp_dictoffsetetp_weaklistoffset, respectivamente. O uso detp_dictoffsetetp_weaklistoffsetainda é aceitado, mas não oferece suporte totalmente a herança múltipla (gh-95589), e o desempenho pode ser pior. Classes que declaramPy_TPFLAGS_MANAGED_DICTdevem chamar_PyObject_VisitManagedDict()e_PyObject_ClearManagedDict()para percorrer e limpar os dicionários de sua instância. Para limpar weakrefs (referências fracas), chamePyObject_ClearWeakRefs(), como antes.A função
PyUnicode_FSDecoder()não aceita mais caminhos bytes ou similar, como os tiposbytearrayememoryview: apenas o tipo exatobytesé aceito para strings de bytes. (Contribuição de Victor Stinner em gh-98393.)As macros
Py_CLEAR,Py_SETREFePy_XSETREFagora avaliam seus argumentos apenas uma vez. Se um argumento tiver efeitos colaterais, esses efeitos colaterais não serão mais duplicados. (Contribuição de Victor Stinner em gh-98724.)O indicador de erro do interpretador agora está sempre normalizado. Isso significa que
PyErr_SetObject(),PyErr_SetString()e as outras funções que definem o indicador de erro agora normalizam a exceção antes de armazená-la. (Contribuição de Mark Shannon em gh-101578.)_Py_RefTotalnão é mais oficial e é mantido apenas para compatibilidade com ABI. Observe que é um global interno e está disponível apenas em compilações de depuração. Se acontecer de você usá-lo, você precisará começar a usar_Py_GetGlobalRefTotal().As seguintes funções agora selecionam uma metaclasse apropriada para o tipo recém-criado:
A criação de classes cujas substituições de metaclasse
tp_newfoi descontinuada e no Python 3.14+ não será permitida. Observe que essas funções ignoramtp_newda metaclasse, possivelmente permitindo uma inicialização incompleta.Observe que
PyType_FromMetaclass()(adicionada em Python 3.12) já não permite a criação de classes cuja metaclasse substituitp_new(__new__()em Python).Como
tp_newsubstitui quase tudo que as funçõesPyType_From*fazem, os dois são incompatíveis entre si. O comportamento existente – ignorar a metaclasse em vários passos de criação do tipo – é inseguro em geral, uma vez que as (meta)classes presumem quetp_newfoi chamado. Não existe uma solução geral simples. Um dos seguintes pode funcionar para você:Se você controla a metaclasse, evite usar
tp_newnela:Se a inicialização puder ser ignorada, isso pode ser feito em
tp_init.Se a metaclasse não precisa ser instanciada do Python, defina seu
tp_newcomoNULLusando o sinalizadorPy_TPFLAGS_DISALLOW_INSTANTIATION. Isso o torna aceitável para funçõesPyType_From*.
Evite funções
PyType_From*: se você não precisa de recursos específicos do C (slots ou configuração do tamanho da instância), crie tipos chamando a metaclasse.Se você sabe que
tp_newpode ser ignorado com segurança, filtre o aviso de descontinuação usandowarnings.catch_warnings()do Python.
PyOS_InputHookePyOS_ReadlineFunctionPointernão são mais chamados em subinterpretadores. Isso ocorre porque os clientes geralmente dependem do estado global de todo o processo (uma vez que esses retornos de chamada não têm como recuperar o estado do módulo de extensão).Isso também evita situações em que as extensões podem ser executadas em um subinterpretador que não oferecem suporte (ou no qual ainda não foram carregadas). Veja gh-104668 para mais informações.
PyLongObjectteve seus componentes internos alterados para melhor desempenho. Embora os internos dePyLongObjectsejam privados, eles são usados por alguns módulos de extensão. Os campos internos não devem mais ser acessados diretamente, em vez disso, as funções da API que começam comPyLong_...devem ser usadas. Duas novas funções de API instáveis são fornecidas para acesso eficiente ao valor dePyLongObjects que cabe em uma única palavra de máquina:Alocadores personalizados, definidos via
PyMem_SetAllocator(), agora precisam ser seguros para thread, independentemente do domínio de memória. Os alocadores que não possuem estado próprio, incluindo “ganchos”, não são afetados. Se o seu alocador personalizado ainda não for seguro para thread e você precisar de orientação, crie um novo relatório de problema no GitHub e CC@ericsnowcurrently.
Descontinuados¶
Em conformidade com a PEP 699, o campo
ma_version_tagemPyDictObjectfoi descontinuado para módulos de extensão. Acessar este campo gerará um aviso do compilador em tempo de compilação. Este campo será removido no Python 3.14. (Contribuição de Ramvikrams e Kumar Aditya em gh-101193. PEP de Ken Jin.)Variáveis de configuração global descontinuadas:
Py_HashRandomizationFlag: usePyConfig.use_hash_seedandPyConfig.hash_seedPy_LegacyWindowsFSEncodingFlag: usePyPreConfig.legacy_windows_fs_encodingPy_LegacyWindowsStdioFlag: usePyConfig.legacy_windows_stdioPy_FileSystemDefaultEncoding: usePyConfig.filesystem_encodingPy_HasFileSystemDefaultEncoding: usePyConfig.filesystem_encodingPy_FileSystemDefaultEncodeErrors: usePyConfig.filesystem_errorsPy_UTF8Mode: usePyPreConfig.utf8_mode(seePy_PreInitialize())
A API
Py_InitializeFromConfig()deve ser usada comPyConfig. (Contribuição de Victor Stinner em gh-77782.)A criação de
tipos imutáveiscom bases mutáveis foi descontinuada e será desativada no Python 3.14. (gh-95388)O cabeçalho
structmember.hfoi descontinuado, embora continue disponível e não haja planos para removê-lo.Seu conteúdo agora está disponível apenas incluindo
Python.h, com um prefixoPyadicionado se estiver faltando:Macros de tipo como
Py_T_INT,Py_T_DOUBLE, etc. (anteriormenteT_INT,T_DOUBLE, etc.)Os sinalizadores
Py_READONLY(anteriormenteREADONLY) ePy_AUDIT_READ(anteriormente todas em maiúsculas)
Vários itens não são expostos em
Python.h:T_OBJECT(usePy_T_OBJECT_EX)T_NONE(anteriormente não documentada e bastante estranha)A macro
WRITE_RESTRICTEDque não faz nada.As macros
RESTRICTEDeREAD_RESTRICTED, equivalentes aPy_AUDIT_READ.Em algumas configurações,
<stddef.h>não está incluído emPython.h. Deve ser incluído manualmente ao usaroffsetof().
O cabeçalho descontinuado continua a fornecer seu conteúdo original com os nomes originais. Seu código antigo pode permanecer inalterado, a menos que as macros extras e sem namespace o incomodem muito.
(Contribuição em gh-47146 de Petr Viktorin, baseado em trabalhos anteriores de Alexander Belopolsky e Matthias Braun.)
PyErr_Fetch()ePyErr_Restore()foram descontinuado. UsePyErr_GetRaisedException()ePyErr_SetRaisedException()em vez disso. (Contribuição de Mark Shannon em gh-101578.)PyErr_Display()foi descontinuada. UsePyErr_DisplayException()em vez disso. (Contribuição de Irit Katriel em gh-102755)._PyErr_ChainExceptionsfoi descontinuada. Use_PyErr_ChainExceptions1em vez disso. (Contribuição de Irit Katriel em gh-102192.)Usar
PyType_FromSpec(),PyType_FromSpecWithBases()ouPyType_FromModuleAndSpec()para criar uma classe cujas substituições de metaclassetp_newfoi descontinuado. Chame a metaclasse.
Remoção pendente no Python 3.14¶
O campo
ma_version_tagemPyDictObjectpara módulos de extensão (PEP 699; gh-101193).A criação de
tipos imutáveiscom bases mutáveis (gh-95388).Funções para configurar a inicialização do Python, descontinuadas no Python 3.11:
PySys_SetArgvEx(): definaPyConfig.argv.PySys_SetArgv(): definaPyConfig.argv.Py_SetProgramName(): definaPyConfig.program_name.Py_SetPythonHome(): definaPyConfig.home.
Em vez disso, a API
Py_InitializeFromConfig()deve ser usada comPyConfig.Variáveis de configuração globais
Py_QuietFlag: usePyConfig.quiet.Py_HashRandomizationFlag: usePyConfig.use_hash_seedePyConfig.hash_seed.Py_LegacyWindowsFSEncodingFlag: usePyPreConfig.legacy_windows_fs_encoding.Py_LegacyWindowsStdioFlag: usePyConfig.legacy_windows_stdio.Py_FileSystemDefaultEncoding: usePyConfig.filesystem_encoding.Py_HasFileSystemDefaultEncoding: usePyConfig.filesystem_encoding.Py_FileSystemDefaultEncodeErrors: usePyConfig.filesystem_errors.Py_UTF8Mode: usePyPreConfig.utf8_mode. (vejaPy_PreInitialize())
Em vez disso, a API
Py_InitializeFromConfig()deve ser usada comPyConfig.
Remoção pendente no Python 3.15¶
A cópia empacotada do
libmpdecimal.The
PyImport_ImportModuleNoBlock(): usePyImport_ImportModule().PyWeakref_GetObject()ePyWeakref_GET_OBJECT(): usePyWeakref_GetRef().O tipo
Py_UNICODEe a macroPy_UNICODE_WIDE: usewchar_t.Funções de inicialização do Python
PySys_ResetWarnOptions(): apaguesys.warnoptionsewarnings.filters.Py_GetPath(): leiasys.path.Py_GetPrefix(): leiasys.prefix.Py_GetPythonHome(): leiaPyConfig.homeou a variável de ambientePYTHONHOME.
Remoção pendente em versões futuras¶
As APIs a seguir foram descontinuadas e serão removidas, embora atualmente não haja uma data agendada para sua remoção.
Py_TPFLAGS_HAVE_FINALIZE: desnecessária desde o Python 3.8.PySlice_GetIndicesEx(): usePySlice_Unpack()ePySlice_AdjustIndices().PyUnicode_AsDecodedObject(): usePyCodec_Decode().PyUnicode_AsDecodedUnicode(): usePyCodec_Decode().PyUnicode_AsEncodedObject(): usePyCodec_Encode().PyUnicode_AsEncodedUnicode(): usePyCodec_Encode().PyUnicode_READY(): desnecessário desde o Python 3.12PyErr_Display(): usePyErr_DisplayException()._PyErr_ChainExceptions(): use_PyErr_ChainExceptions1().O membro
PyBytesObject.ob_shash: chamePyObject_Hash().O membro
PyDictObject.ma_version_tag.API do Thread Local Storage (TLS):
PyThread_ReInitTLS(): desnecessário desde o Python 3.7.
Removidos¶
Remove o arquivo de cabeçalho
token.h. Nunca houve nenhuma API C de tokenizador público. O arquivo de cabeçalhotoken.hfoi projetado apenas para ser usado por internos do Python. (Contribuição de Victor Stinner em gh-92651.)As APIs Unicode legadas foram removidas. Veja a PEP 623 para detalhes.
PyUnicode_WCHAR_KINDPyUnicode_AS_UNICODE()PyUnicode_AsUnicode()PyUnicode_AsUnicodeAndSize()PyUnicode_AS_DATA()PyUnicode_FromUnicode()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_GET_DATA_SIZE()
Remove a macro de função
PyUnicode_InternImmortal(). (Contribuição de Victor Stinner em gh-85858.)
Alterações notáveis no 3.12.4¶
ipaddress¶
Corrigido o comportamento de
is_globaleis_privateemIPv4Address,IPv6Address,IPv4NetworkeIPv6Network.
Alterações notáveis no 3.12.5¶
email¶
Cabeçalhos com novas linhas embutidas agora são colocados entre aspas na saída.
O
generatoragora 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, definaverify_generated_headers. (Contribuição de Bas Bloemsaat e Petr Viktorin em gh-121650.)
Alterações notáveis no 3.12.6¶
email¶
email.utils.getaddresses()eemail.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: usestrict=Falsepara 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.)
Alterações notáveis no 3.12.8¶
sys¶
A função especial
sys.getobjects(), anteriormente não documentada, que só existe em construções especializadas do Python, agora pode retornar objetos de outros interpretadores além daquele em que foi chamada.
Notable changes in 3.12.10¶
os.path¶
O parâmetro strict para
os.path.realpath()aceita um novo valor,os.path.ALLOW_MISSING. Se usado, erros diferentes deFileNotFoundErrorserão levantados novamente; o caminho resultante pode estar ausente, mas estará livre de links simbólicos. (Contribuição de Petr Viktorin para CVE 2025-4517.)
tarfile¶
data_filter()agora normaliza alvos de links simbólicos para evitar ataques de travessia de caminho. (Contribuição de Petr Viktorin em gh-127987 e CVE 2025-4138.)extractall()agora ignora a correção de atributos de diretório quando um diretório é removido ou substituído por outro tipo de arquivo. (Contribuição de Petr Viktorin em gh-127987 e CVE 2024-12718.)extract()eextractall()agora (re)aplicam o filtro de extração ao substituir um link (físico ou simbólico) por uma cópia de outro membro do arquivo e ao corrigir atributos de diretório. O primeiro levanta uma nova exceção,LinkFallbackError. (Contribuição de Petr Viktorin para CVE 2025-4330 e CVE 2024-12718.)extract()eextractall()não extraem mais membros rejeitados quandoerrorlevel()é zero. (Contribuição de Matt Prodani e Petr Viktorin em gh-112887 e CVE 2025-4435.)