O que há de novo no Python 3.13

Editores:

Adam Turner e Thomas Wouters

Este artigo explica os novos recursos no Python 3.13, em comparação com 3.12. Python 3.13 foi lançado em 7 de outubro de 2024. Veja changelog para uma lista completa de mudanças.

Ver também

PEP 719 – Cronograma de lançamento do Python 3.13

Resumo – Destaques da versão

O Python 3.13 é a versão estável mais recente da linguagem de programação Python, com uma mistura de mudanças na linguagem, na implementação e na biblioteca padrão. As maiores mudanças incluem um novo interpretador interativo, suporte experimental para execução em um modo de threads livres (PEP 703) e um compilador Just-In-Time (PEP 744).

As mensagens de erro continuam a melhorar, com tracebacks (situação da pilha de execução) agora realçados em cores por padrão. A função embutida locals() agora tem semânticas definidas para alterar o mapeamento retornado, e os parâmetros de tipo agora oferecem suporte a valores padrão.

As alterações da biblioteca contêm a remoção de APIs e módulos descontinuados, bem como as melhorias usuais em facilidade de uso e correção. Vários módulos da biblioteca padrão legados agora foram removidos após sua descontinuação no Python 3.11 (PEP 594).

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, consulte a documentação, como Referência da Biblioteca e Referência da Linguagem. Para 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. Veja Portando para o Python 3.13 para orientação sobre atualização a partir de versões anteriores do Python.


Melhorias no interpretador:

Melhorias no modelo de dados Python:

  • __static_attributes__ armazena os nomes dos atributos acessados ​​por meio de self.X em qualquer função no corpo da classe.

  • __firstlineno__ registra o número da primeira linha da definição de classe.

Melhorias significativas na biblioteca padrão:

Melhorias de segurança:

Melhorias na API C:

  • O slot Py_mod_gil agora é usado para indicar que um módulo de extensão oferece suporte à execução com a GIL desabilitada.

  • A API C PyTime foi adicionada, fornecendo acesso aos relógios do sistema.

  • PyMutex é um novo mutex leve que ocupa um único byte.

  • Há um novo conjunto de funções para gerar eventos de monitoramento da PEP 669 na API C.

Novos recursos de tipagem:

Suporte à plataforma:

Remoções importantes:

  • PEP 594: as 19 “baterias descarregadas” (módulos legados da biblioteca padrão) restantes foram removidas da biblioteca padrão: aifc, audioop, cgi, cgitb, chunk, crypt, imghdr, mailcap, msilib, nis, nntplib, ossaudiodev, pipes, sndhdr, spwd, sunau, telnetlib, uu e xdrlib.

  • Remove a ferramenta 2to3 e o módulo lib2to3 (descontinuados no Python 3.11).

  • Remove o módulo tkinter.tix (descontinuado no Python 3.6).

  • Remove a função locale.resetlocale().

  • Remove os espaços de nomes typing.io e typing.re.

  • Remove descritores encadeados de classmethod.

Mudanças no cronograma de lançamento:

PEP 602 (“Ciclo de Lançamento Anual para Python”) foi atualizado para estender o período de suporte total (“bugfix”) para novos lançamentos para dois anos. Esta política atualizada significa que:

  • O Python 3.9–3.12 tem um ano e meio de suporte total, seguido por três anos e meio de correções de segurança.

  • Python 3.13 e posteriores têm dois anos de suporte total, seguidos de três anos de correções de segurança.

Novas funcionalidades

Um melhor interpretador interativo

Python agora usa um novo console interativo por padrão, com base no código do projeto PyPy. Quando o usuário inicia o REPL de um terminal interativo, agora os seguintes novos recursos estão disponíveis:

  • Edição multilinha com preservação do histórico.

  • Suporte direto para comandos específicos do REPL, como help, exit e quit, sem a necessidade de chamá-los como funções.

  • Prompts e tracebacks com cores habilitadas por padrão.

  • Ajuda interativa para navegar usando F1 com um histórico de comandos separado.

  • Navegação no histórico usando F2 que ignora a saída, bem como os prompts >>> e .

  • “Modo de colagem” com F3 que facilita colar blocos de código maiores (pressione F3 novamente para retornar ao prompt normal).

Para desabilitar o novo console interativo, defina a variável de ambiente PYTHON_BASIC_REPL. Para mais informações sobre o modo interativo, veja Modo interativo.

(Contribuição de Pablo Galindo Salgado, Łukasz Langa e Lysandros Nikolaou em gh-111201 baseado no código do projeto PyPy. Suporte ao Windows foi uma contribuição de Dino Viehland e Anthony Shaw.)

Mensagens de erro melhoradas

  • Um erro comum é escrever um script com o mesmo nome de um módulo de biblioteca padrão. Quando isso resulta em erros, agora exibimos uma mensagem de erro mais útil:

    $ python random.py
    Traceback (most recent call last):
      File "/home/me/random.py", line 1, in <module>
        import random
      File "/home/me/random.py", line 3, in <module>
        print(random.randint(5))
              ^^^^^^^^^^^^^^
    AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
    

    Da mesma forma, se um script tiver o mesmo nome de um módulo de terceiros que ele tentar importar e isso resultar em erros, também exibiremos uma mensagem de erro mais útil:

    $ python numpy.py
    Traceback (most recent call last):
      File "/home/me/numpy.py", line 1, in <module>
        import numpy as np
      File "/home/me/numpy.py", line 3, in <module>
        np.array([1, 2, 3])
        ^^^^^^^^
    AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
    

    (Contribuição de Shantanu Jain em gh-95754.)

  • A mensagem de erro agora tenta sugerir o argumento nomeado correto quando um argumento nomeado incorreto é passado para uma função.

    >>> "Better error messages!".split(max_split=1)
    Traceback (most recent call last):
      File "<python-input-0>", line 1, in <module>
        "Better error messages!".split(max_split=1)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
    TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
    

    (Contribuição de Pablo Galindo Salgado e Shantanu Jain em gh-107944.)

CPython com threads livres

O CPython agora tem suporte experimental para execução em modo de threads livres, com a trava global do interpretador (GIL) desabilitada. Este é um recurso experimental e, portanto, não é habilitado por padrão. O modo de threads livres requer um executável diferente, geralmente chamado de python3.13t ou python3.13t.exe. Binários pré-construídos marcados como free-threaded podem ser instalados como parte dos instaladores oficiais Windows e macOS, ou o CPython pode ser construído a partir da fonte com a opção --disable-gil.

A execução de threads livres permite a utilização total do poder de processamento disponível ao executar threads em paralelo nos núcleos de CPU disponíveis. Embora nem todos os softwares se beneficiem disso automaticamente, programas projetados com threading em mente serão executados mais rapidamente em hardware multi-core. O modo de threads livres é experimental e o trabalho está em andamento para melhorá-lo: espere alguns bugs e um impacto substancial no desempenho de thread único. As construções de threads livres do CPython oferecem suporte à execução opcional com a GIL habilitada no tempo de execução usando a variável de ambiente PYTHON_GIL ou a opção de linha de comando -X gil=1.

Para verificar se o interpretador atual oferece suporte a threads livres, python -VV e sys.version contêm “experimental free-threading build”. A nova função sys._is_gil_enabled() pode ser usada para verificar se a GIL está realmente desabilitada no processo em execução.

Os módulos de extensão da API C precisam ser construídos especificamente para a construção com threads livres. Extensões que oferecem suporte à execução com GIL desabilitada devem usar o slot Py_mod_gil. Extensões que usam inicialização monofásica devem usar PyUnstable_Module_SetGIL() para indicar se oferecem suporte à execução com a GIL desabilitada. A importação de extensões C que não usam esses mecanismos fará com que a GIL seja habilitada, a menos que a GIL tenha sido explicitamente desabilitada com a variável de ambiente PYTHON_GIL ou a opção -X gil=0. pip 24.1 ou mais recentes é necessário para instalar pacotes com extensões C na construção de threads livres.

Este trabalho foi possível graças a muitos indivíduos e organizações, incluindo a grande comunidade de colaboradores do Python e projetos de terceiros para testar e habilitar o suporte para threads livres. Colaboradores notáveis ​​incluem: Sam Gross, Ken Jin, Donghee Na, Itamar Oren, Matt Page, Brett Simmers, Dino Viehland, Carl Meyer, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou e muitos outros. Muitos desses colaboradores são empregados pela Meta, que forneceu recursos de engenharia significativos para dar suporte a este projeto.

Ver também

PEP 703 “Tornando a trava global do interpretador opcional no CPython” contém justificativa e informações sobre este trabalho.

Portando módulos de extensão para oferecer suporte a threads livres: um guia de portabilidade mantido pela comunidade para autores de extensões.

Um compilador just-in-time (JIT) experimental

Quando o CPython é configurado e construído usando a opção --enable-experimental-jit, um compilador just-in-time (JIT) é adicionado, o que pode acelerar alguns programas Python. No Windows, use PCbuild/build.bat --experimental-jit para habilitar o JIT ou --experimental-jit-interpreter para habilitar o interpretador Tier 2. Os requisitos de construção e outras informações de suporte estão contidos em Tools/jit/README.md.

A opção --enable-experimental-jit aceita esses valores (opcionais), assumindo como padrão yes se --enable-experimental-jit estiver presente sem o valor opcional.

  • no: desativa todo o pipeline de Tier 2 e JIT.

  • yes: habilita o JIT. Para desabilitar o JIT em tempo de execução, passe a variável de ambiente PYTHON_JIT=0.

  • yes-off: constrói o JIT, mas desabilita-o por padrão. Para habilitar o JIT em tempo de execução, passe a variável de ambiente PYTHON_JIT=1.

  • interpreter: habilita o interpretador Tier 2, mas desabilita o JIT. O interpretador pode ser desabilitado executando com PYTHON_JIT=0.

A arquitetura interna é aproximadamente a seguinte:

  • Começamos com especializado bytecode de Tier 1. Veja O que há de novo no 3.11 para detalhes.

  • Quando o bytecode Tier 1 fica quente o suficiente, ele é traduzido para uma nova representação intermediária (IR) puramente interna, também chamado de IR Tier 2, e às vezes chamada de micro-ops (“uops”).

  • O IR Tier 2 usa a mesma máquina virtual baseada em pilha que o Tier 1, mas o formato de instrução é mais adequado para tradução em código de máquina.

  • Temos vários passes de otimização para IR Tier 2, que são aplicados antes de serem interpretados ou traduzidos em código de máquina.

  • Existe um interpretador de Tier 2, mas ele se destina principalmente à depuração dos estágios iniciais do pipeline de otimização. O interpretador Tier 2 pode ser habilitado configurando o Python com --enable-experimental-jit=interpreter.

  • Quando o JIT está habilitado, o IR Tier 2 otimizado é traduzido em código de máquina, que é então executado.

  • O processo de tradução de código de máquina usa uma técnica chamada copiar e corrigir. Não possui dependências de tempo de execução, mas há uma nova dependência de tempo de construção no LLVM.

Ver também

PEP 744

(JIT de Brandt Bucher, inspirado em um artigo de Haoran Xu e Fredrik Kjolstad. Tier 2 IR de Mark Shannon e Guido van Rossum. Otimizador Tier 2 de Ken Jin.)

Definidas semânticas de mutação para locals()

Historicamente, o resultado esperado da mutação do valor de retorno de locals() foi deixada para as implementações individuais de Python definirem. A partir do Python 3.13, PEP 667 padroniza o comportamento histórico do CPython para a maioria dos escopos de execução de código, mas altera escopos otimizados (funções, geradores, corrotinas, compreensões e expressões geradoras) para retornar explicitamente instantâneos independentes das variáveis ​​locais atualmente atribuídas, incluindo variáveis ​​não locais referenciadas localmente capturadas em encerramentos.

Esta mudança na semântica de locals() em escopos otimizados também afeta o comportamento padrão das funções de execução de código que visam implicitamente locals() se nenhum espaço de nomes explícito for fornecido (como exec() e eval()). Nas versões anteriores, se as alterações podiam ou não ser acessadas chamando locals() após chamar a função de execução de código dependia da implementação. Especificamente no CPython, esse código normalmente parece funcionar conforme desejado, mas às vezes pode falhar em escopos otimizados com base em outro código (incluindo depuradores e ferramentas de rastreamento de execução de código), redefinindo potencialmente o instantâneo compartilhado nesse escopo. Agora, o código sempre será executado em um instantâneo independente das variáveis ​​locais em escopos otimizados e, portanto, as alterações nunca serão visíveis em chamadas subsequentes para locals(). Para acessar as alterações feitas nesses casos, uma referência explícita de espaço de nomes deve agora ser passada para a função relevante. Alternativamente, pode fazer sentido atualizar o código afetado para usar uma API de execução de código de nível mais alto que retorne o espaço de nomes de execução de código resultante (por exemplo, runpy.run_path() ao executar arquivos Python do disco).

Para garantir que depuradores e ferramentas semelhantes possam atualizar de forma confiável variáveis ​​locais em escopos afetados por esta mudança, FrameType.f_locals agora retorna um proxy write-through para as variáveis ​​locais e não locais referenciadas localmente do quadro nesses escopos, em vez de retornar uma instância dict compartilhada atualizada inconsistentemente com semântica de tempo de execução indefinida.

Veja PEP 667 para mais detalhes, incluindo alterações e descontinuações relacionadas à API C. Notas de portabilidade também são fornecidas abaixo para as APIs de Python e as APIs de C afetadas.

(PEP e implementação são contribuição de Mark Shannon e Tian Gao em gh-74929. Atualizações da documentação fornecidas por Guido van Rossum e Alyssa Coghlan.)

Suporte para plataformas móveis

PEP 730: iOS agora é uma plataforma com suporte conforme a PEP 11, com os alvos arm64-apple-ios e arm64-apple-ios-simulator no nível 3 (dispositivos iPhone e iPad lançados após 2013 e o simulador Xcode iOS sendo executado em hardware Apple Silicon, respectivamente). x86_64-apple-ios-simulator (o simulador Xcode iOS sendo executado em hardware x86_64 mais antigo) não é uma plataforma com suporte nível 3, mas terá o melhor suporte possível. (PEP escrita e implementação como contribuição de Russell Keith-Magee em gh-114099.)

PEP 738: Android agora é uma plataforma com suporte conforme a PEP 11, com os alvos aarch64-linux-android e x86_64-linux-android no nível 3. Os alvos de 32 bits arm-linux-androideabi e i686-linux-android não são plataformas com suporte de nível 3, mas terão o melhor suporte possível. (PEP escrita e implementação como contribuição de Malcolm Smith em gh-116622.)

Ver também

PEP 730, PEP 738

Outras mudanças na linguagem

  • O compilador agora remove espaços em branco comuns de cada linha em uma docstring. Isso reduz o tamanho do cache de bytecode (como arquivos .pyc), com reduções no tamanho do arquivo de cerca de 5%, por exemplo, em sqlalchemy.orm.session do SQLAlchemy 2.0. Essa alteração afeta ferramentas que usam docstrings, como doctest.

    >>> def spam():
    ...     """
    ...         Esta é uma docstring com
    ...           espaços em branco no começo.
    ...
    ...         Ela atém mesmo tem vários parágrafos!
    ...     """
    ...
    >>> spam.__doc__
    '\n\nEsta é uma docstring com\n\n espaços em branco no começo.\n\n\nEla atém mesmo tem vários parágrafos!\n\n'
    

    (Contribuição de Inada Naoki em gh-81283.)

  • Escopos de anotação dentro dos escopos de classe agora pode conter lambdas e compreensões. As compreensões localizadas nos escopos de classe não são incorporadas ao escopo pai.

    class C[T]:
        type Alias = lambda: T
    

    (Contribuição de Jelle Zijlstra em gh-109118 e gh-118160.)

  • Instruções future não são mais acionadas por importações relativas do módulo __future__, o que significa que instruções no formato from .__future__ import ... agora são simplesmente importações relativas padrão, sem recursos especiais ativados. (Contribuição de Jeremiah Gabriel Pascual em gh-118216.)

  • Declarações global agora são permitidas em blocos except quando esse global é usado no bloco else. Anteriormente, isso erroneamente levantava uma exceção SyntaxError. (Contribuição de Irit Katriel em gh-111123.)

  • Adiciona PYTHON_FROZEN_MODULES, uma nova variável de ambiente que determina se os módulos congelados são ignorados pelo maquinário de importação, equivalente à opção de linha de comando -X frozen_modules. (Contribuição de Yilei Yang em gh-111374.)

  • Adicionado suporte ao perfilador perf funcionando sem ponteiros de quadro através da nova variável de ambiente PYTHON_PERF_JIT_SUPPORT e opção de linha de comando -X perf_jit. (Contribuição de Pablo Galindo em gh-118518.)

  • A localização de um arquivo .python_history pode ser alterada por meio da nova variável de ambiente PYTHON_HISTORY. (Contribuição de Levi Sabah, Zackery Spytz e Hugo van Kemenade em gh-73965.)

  • As classes têm um novo atributo __static_attributes__. Isso é preenchido pelo compilador, com uma tupla de nomes de atributos da classe que são atribuídos através de self.<name> de qualquer função em seu corpo. (Contribuição de Irit Katriel em gh-115775.)

  • O compilador agora cria um atributo __firstlineno__ em classes com o número da primeira linha da definição de classe. (Contribuição de Serhiy Storchaka em gh-118465.)

  • As funções embutidas exec() e eval() agora aceitam os argumentos globals e locals como nomeados. (Contribuição de Raphael Gaschignard em gh-105879)

  • A função embutida compile() agora aceita um novo sinalizador, ast.PyCF_OPTIMIZED_AST, que é semelhante a ast.PyCF_ONLY_AST exceto que a AST retornada é otimizada de acordo com o valor do argumento optimize. (Contribuição de Irit Katriel em gh-108113).

  • Adiciona um atributo __name__ em objetos property. (Contribuição de Eugene Toder em gh-101860.)

  • Adiciona PythonFinalizationError, uma nova exceção derivada de RuntimeError e usada para sinalizar quando as operações são bloqueadas durante a finalização. Os seguintes chamáveis agora levantam PythonFinalizationError, em vez de RuntimeError:

    (Contribuição de Victor Stinner em gh-114570.)

  • Permite que o argumento count de str.replace() seja um argumento nomeado. (Contribuição de Hugo van Kemenade em gh-106487.)

  • Muitas funções agora emitem um aviso se um valor booleano for passado como argumento do descritor de arquivo. Isso pode ajudar a detectar alguns erros mais cedo. (Contribuição de Serhiy Storchaka em gh-82626.)

  • Adicionados atributos name e mode para objetos arquivo ou similar compactados e arquivados nos módulos bz2, lzma, tarfile e zipfile. (Contribuição de Serhiy Storchaka em gh-115961.)

Novos módulos

Módulos melhorados

argparse

  • Adiciona o parâmetro deprecated aos métodos add_argument() e add_parser(), o qual permite descontinuar opções de linha de comando, argumentos posicionais e subcomandos. (Contribuição de Serhiy Storchaka em gh-83648.)

array

  • Adiciona o código do tipo 'w' (Py_UCS4) para caracteres Unicode. Ele deve ser usado no lugar do descontinuado código do tipo 'u'. (Contribuição de Inada Naoki em gh-80480.)

  • Registra array.array como MutableSequence implementando o método clear(). (Contribuição de Mike Zimin em gh-114894.)

ast

  • Os construtores dos tipos de nós no módulo ast agora são mais rígidos nos argumentos que aceitam, com um comportamento mais intuitivo quando os argumentos são omitidos.

    Se um campo opcional em um nó AST não for incluído como argumento ao construir uma instância, o campo agora será definido como None. Da mesma forma, se um campo de lista for omitido, esse campo será agora definido como uma lista vazia, e se um campo expr_context for omitido, o padrão será Load(). (Anteriormente, em todos os casos, o atributo estaria ausente na instância do nó de AST recém-construída.)

    Em todos os outros casos, nos quais um argumento é omitido, o construtor de nós vai emitir uma DeprecationWarning. Isso vai levantar uma exceção no Python 3.15. Da mesma forma, passar um argumento nomeado para o construtor que não mapeia para um campo no nó AST agora está descontinuado e vai levantar uma exceção no Python 3.15.

    Estas mudanças não se aplicam às subclasses definidas pelo usuário de ast.AST, a menos que a classe opte pelo novo comportamento definindo o mapeamento AST._field_types.

    (Contribuição de Jelle Zijlstra em gh-105858, gh-117486 e gh-118851.)

  • ast.parse() agora aceita um argumento opcional optimize que é passado para compile(). Isto torna possível obter um AST otimizado. (Contribuição de Irit Katriel em gh-108113.)

asyncio

  • asyncio.as_completed() agora retorna um objeto que é ao mesmo tempo um iterador assíncrono e um iterator simples de aguardáveis. Os aguardáveis ​​gerados pela iteração assíncrona incluem tarefas originais ou objetos futuros que foram passados, facilitando a associação dos resultados às tarefas que estão sendo concluídas. (Contribuição de Justin Arthur em gh-77714.)

  • asyncio.loop.create_unix_server() agora removerá automaticamente o soquete Unix quando o servidor for fechado. (Contribuição de Pierre Ossman em gh-111246.)

  • DatagramTransport.sendto() agora enviará datagramas de comprimento zero se for chamado com um objeto de bytes vazios. O controle de fluxo de transporte agora também leva em conta o cabeçalho do datagrama ao calcular o tamanho do buffer. (Contribuição de Jamie Phan em gh-115199.)

  • Adiciona Queue.shutdown e QueueShutDown para gerenciar a terminação da fila. (Contribuição de Laurie Opperman e Yves Duprat em gh-104228.)

  • Adiciona os métodos Server.close_clients() e Server.abort_clients(), que fecham de forma mais forçada um servidor asyncio. (Contribuição de Pierre Ossman em gh-113538.)

  • Aceita uma tupla de separadores em StreamReader.readuntil(), parando quando qualquer um deles for encontrado. (Contribuição de Bruce Merry em gh-81322.)

  • Melhora o comportamento de TaskGroup quando um cancelamento externo colide com um cancelamento interno. Por exemplo, quando dois grupos de tarefas estão aninhados e ambos experimentam uma exceção em uma tarefa filho simultaneamente, é possível que o grupo de tarefas externo seja interrompido, porque seu cancelamento interno foi engolido pelo grupo de tarefas interno.

    No caso em que um grupo de tarefas é cancelado externamente e também deve levantar ExceptionGroup, ele agora chamará o método cancel() da tarefa pai. Isso garante que uma CancelledError será levantada no próximo await, para que o cancelamento não seja perdido.

    Um benefício adicional dessas mudanças é que os grupos de tarefas agora preservam a contagem de cancelamentos (cancelling()).

    Para lidar com alguns casos extremos, uncancel() agora pode redefinir o sinalizador não documentado _must_cancel quando a contagem de cancelamentos chegar a zero.

    (Inspirado por um relatório de problema relatado por Arthur Tacca em gh-116720.)

  • Quando TaskGroup.create_task() é chamado em um TaskGroup inativo, a corrotina fornecida será fechada (o que evita que um RuntimeWarning sobre a corrotina fornecida nunca seja aguardado). (Contribuição de Arthur Tacca e Jason Zhang em gh-115957.)

base64

compileall

concurrent.futures

configparser

  • ConfigParser agora tem suporte para seções sem nome, o que permite pares de chave-valor de nível superior. Isso pode ser habilitado com o novo parâmetro allow_unnamed_section. (Contribuição de Pedro Sousa Lacerda em gh-66449.)

copy

ctypes

  • Como consequência da refatoração interna necessária, a inicialização de metaclasses internas agora acontece em __init__ em vez de __new__. Isso afeta projetos que fazem subclasse dessas metaclasses internas para fornecer inicialização personalizada. De forma geral:

    • A lógica personalizada que foi feita em __new__ após chamar super().__new__ deve ser movida para __init__.

    • Para criar uma classe, chame a metaclasse, não apenas o método __new__ da metaclasse.

    Veja gh-124520 para discussão e links para mudanças em alguns projetos afetados.

  • Os objetos ctypes.Structure têm um novo atributo _align_ que permite que o alinhamento da estrutura que está sendo empacotada para/da memória seja especificado explicitamente. (Contribuição de Matt Sanderson em gh-112433)

dbm

  • Adiciona dbm.sqlite3, um novo módulo que implementa um backend SQLite, e torna-o o backend padrão dbm. (Contribuição de Raymond Hettinger e Erlend E. Aasland em gh-100414.)

  • Permite a remoção de todos os itens do banco de dados por meio dos novos métodos gdbm.clear() e ndbm.clear(). (Contribuição de Donghee Na em gh-107122.)

dis

  • Altera a saída das funções do módulo dis para mostrar rótulos lógicos para alvos de salto e manipuladores de exceção, em vez de deslocamentos. Os deslocamentos podem ser adicionados com a nova opção de linha de comando -O ou o argumento show_offsets. (Contribuição de Irit Katriel em gh-112137.)

  • get_instructions() não representa mais entradas de cache como instruções separadas. Em vez disso, ele os retorna como parte de Instruction, no novo campo cache_info. O argumento show_caches para get_instructions() foi descontinuado e não tem mais nenhum efeito. (Contribuição de Irit Katriel em gh-112962.)

doctest

email

  • Cabeçalhos com novas linhas embutidas são agora colocadas entre aspas na saída. O generator agora se recusará a serializar (escrever) cabeçalhos que são dobrados ou delimitados incorretamente, de modo que eles seriam analisados ​​como vários cabeçalhos ou unidos a dados adjacentes. Se você precisar desativar esse recurso de segurança, defina verify_generated_headers. (Contribuição de Bas Bloemsaat e Petr Viktorin em gh-121650.)

  • getaddresses() e parseaddr() agora retornam pares ('', '') em mais situações onde endereços de e-mail inválidos são encontrados em vez de valores potencialmente imprecisos. As duas funções têm agora um novo parâmetro opcional strict (padrão True). Para obter o comportamento antigo (aceitar entrada malformada), strict=False. 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 CVE 2023-27043.)

fractions

glob

  • Adiciona translate(), uma função que converte uma especificação de caminho com curingas estilo shell em uma expressão regular. (Contribuição de Barney Gale em gh-72904.)

importlib

  • As seguintes funções em importlib.resources agora permitem acessar um diretório (ou árvore) de recursos, usando múltiplos argumentos posicionais (os argumentos encoding e errors nas funções de leitura de texto agora são somente-nomeados):

    Essas funções não estão mais descontinuadas e não estão programadas para remoção. (Contribuição de Petr Viktorin em gh-116608.)

  • A contents() permanece descontinuada em favor da API completa Traversable. No entanto, agora não há planos para removê-la. (Contribuição de Petr Viktorin em gh-116608.)

io

ipaddress

itertools

  • batched() tem um novo parâmetro strict, que levanta uma ValueError se o lote final for menor que o tamanho do lote especificado. (Contribuição de Raymond Hettinger em gh-113202.)

marshal

  • Adiciona o parâmetro allow_code nas funções do módulo. Passar allow_code=False evita a serialização e desserialização de objetos de código que são incompatíveis entre versões do Python. (Contribuição de Serhiy Storchaka em gh-113626.)

math

  • A nova função fma() realiza operações fundidas de multiplicação e adição. Ela calcula x * y + z com apenas uma única rodada e, portanto, evita qualquer perda intermediária de precisão. Ele envolve a função fma() fornecida pelo C99 e segue a especificação da operação IEEE 754 “fusedMultiplyAdd” para casos especiais. (Contribuição de Mark Dickinson e Victor Stinner em gh-73468.)

mimetypes

mmap

  • mmap agora está protegida contra travamentos no Windows quando a memória mapeada está inacessível devido a erros no sistema de arquivos ou violações de acesso. (Contribuição de Jannis Weigend em gh-118209.)

  • mmap tem um novo método seekable() que pode ser usado quando um objeto pesquisável arquivo ou similar é necessário. O método seek() agora retorna a nova posição absoluta. (Contribuição de Donghee Na e Sylvie Liberman em gh-111835.)

  • O novo parâmetro trackfd somente para UNIX para mmap controla a duplicação do descritor de arquivo; se falso, o descritor de arquivo especificado por fileno não será duplicado. (Contribuição de Zackery Spytz e Petr Viktorin em gh-78502.)

multiprocessing

os

os.path

  • Adiciona isreserved() para verificar se um caminho está reservado no sistema atual. Esta função está disponível apenas no Windows. (Contribuição de Barney Gale em gh-88569.)

  • No Windows, isabs() não considera mais caminhos que começam com exatamente uma barra (\ ou /) como absolutos. (Contribuição de Barney Gale e Jon Foster em gh-44626.)

  • realpath() agora resolve nomes de arquivos no estilo MS-DOS, mesmo que o arquivo não esteja acessível. (Contribuição de Moonsik Park em gh-82367.)

pathlib

pdb

  • breakpoint() e set_trace() agora entram no depurador imediatamente em vez de na próxima linha de código a ser executada. Esta mudança evita que o depurador quebre fora do contexto quando breakpoint() estiver posicionado no final do contexto. (Contribuição de Tian Gao em gh-118579.)

  • sys.path[0] não mais é substituído pelo diretório do script que está sendo depurado quando sys.flags.safe_path está definido.(Contribuição de Tian Gao e Christian Walther em gh-111762.)

  • zipapp agora é suportado como alvo de depuração. (Contribuição de Tian Gao em gh-118501.)

  • Adiciona a capacidade de mover entre exceções encadeadas durante a depuração post-mortem em pm() usando o novo comando exceptions [número_exc] para Pdb. (Contribuição de Matthias Bussonnier em gh-106676.)

  • Expressões e instruções cujo prefixo é um comando pdb agora são identificadas e executadas corretamente. (Contribuição de Tian Gao em gh-108464.)

queue

random

re

  • Renomeia re.error para PatternError para maior clareza. re.error é mantido para compatibilidade com versões anteriores.

shutil

  • Suporte aos argumentos nomeados dir_fd e follow_symlinks em chown(). (Contribuição de Berker Peksag e Tahia K em gh-62308)

site

  • Os arquivos .pth agora são decodificados primeiro usando UTF-8 e depois usando codificação da localidade se a decodificação UTF-8 falhar. (Contribuição de Inada Naoki em gh-117802.)

sqlite3

ssl

statistics

  • Adiciona kde() para estimativa de densidade do núcleo. Isto torna possível estimar uma função de densidade de probabilidade contínua a partir de um número fixo de amostras discretas. (Contribuição de Raymond Hettinger em gh-115863.)

  • Adiciona kde_random() para amostragem de uma função de densidade de probabilidade estimada criada por kde(). (Contribuição de Raymond Hettinger em gh-115863.)

subprocess

  • O módulo subprocess agora usa a função posix_spawn() em mais situações.

    Notavelmente, quando close_fds é True (o padrão), posix_spawn() será usado quando a biblioteca C fornecer posix_spawn_file_actions_addclosefrom_np(), que inclui versões recentes do Linux, FreeBSD e Solaris. No Linux, isso deve ter um desempenho semelhante ao código existente baseado em vfork() do Linux.

    Um botão de controle privado subprocess._USE_POSIX_SPAWN pode ser definido como False se você precisar forçar subprocess a nunca usar posix_spawn(). Por favor, informe o motivo e os detalhes da plataforma no rastreador de problemas se você definir isso para que possamos melhorar nossa lógica de seleção de API para todos. (Contribuído por Jakub Kulik em gh-113117.)

sys

  • Adiciona a função _is_interned() para testar se uma string foi internada. Não há garantia de que esta função exista em todas as implementações do Python. (Contribuição de Serhiy Storchaka em gh-78573.)

tempfile

time

  • No Windows, monotonic() agora usa o relógio QueryPerformanceCounter() para uma resolução de 1 microssegundo, em vez do relógio GetTickCount64() que tem uma resolução de 15.6 milissegundos. (Contribuição de Victor Stinner em gh-88494.)

  • No Windows, time() agora usa o relógio GetSystemTimePreciseAsFileTime() para uma resolução de 1 microssegundo, em vez do relógio GetSystemTimeAsFileTime() que tem uma resolução de 15.6 milissegundos. (Contribuição de Victor Stinner em gh-63207.)

tkinter

  • Adiciona métodos de widget tkinter: tk_busy_hold(), tk_busy_configure(), tk_busy_cget(), tk_busy_forget(), tk_busy_current() e tk_busy_status(). (Contribuição de Miguel, klappnase e Serhiy Storchaka em gh-72684.)

  • O método wm_attributes() de widget tkinter agora aceita o nome do atributo sem o prefixo negativo para obter atributos de janela (por exemplo, w.wm_attributes('alpha')) e permite especificar atributos e valores para definir como argumentos nomeados (por exemplo, w.wm_attributes(alpha=0.5)). (Contribuição de Serhiy Storchaka em gh-43457.)

  • wm_attributes() agora pode retornar atributos como um dict, usando o novo parâmetro somente-nomeado opcional return_python_dict. (Contribuição de Serhiy Storchaka em gh-43457.)

  • Text.count() agora pode retornar um int simples quando o novo parâmetro somente-nomeado opcional return_ints é usado. Caso contrário, a contagem única é retornada como uma tupla de 1 elemento ou None. (Contribuição de Serhiy Storchaka em gh-97928.)

  • Suporte ao tipo de elemento “vsapi” no método element_create() de tkinter.ttk.Style. (Contribuição de Serhiy Storchaka em gh-68166.)

  • Adiciona o método after_info() para widgets do Tkinter. (Contribuição de Cheryl Sabella em gh-77020.)

  • Adiciona um novo método copy_replace() a PhotoImage para copiar uma região de uma imagem para outra, possivelmente com zoom de pixel, subamostragem ou ambos. (Contribuição de Serhiy Storchaka em gh-118225.)

  • Adiciona parâmetro from_coords para os métodos copy(), zoom() e subsample() da classe PhotoImage. Adiciona parâmetros zoom e subsample para o método copy() da classe PhotoImage. (Contribuição de Serhiy Storchaka em gh-118225.)

  • Adiciona os métodos PhotoImage read() para ler uma imagem de um arquivo e data() para obter os dados da imagem. Adiciona os parâmetros background e grayscale ao método write(). (Contribuição de Serhiy Storchaka em gh-118271.)

traceback

types

  • SimpleNamespace agora pode receber um único argumento posicional para inicializar os argumentos do espaço de nomes. Este argumento deve ser um mapeamento ou um iterável de pares chave-valor. (Contribuição de Serhiy Storchaka em gh-108191.)

typing

  • PEP 705: adiciona ReadOnly, uma construção especial de tipagem para marcar um item TypedDict como somente leitura para verificadores de tipo.

  • PEP 742: adiciona TypeIs, uma construção de tipagem que pode ser usada para instruir um verificador de tipos sobre como restringir um tipo.

  • Adiciona NoDefault, um objeto sinalizador usado para representar os padrões de alguns parâmetros no módulo typing. (Contribuição de Jelle Zijlstra em gh-116126.)

  • Adicione get_protocol_members() para retornar o conjunto de membros que definem uma typing.Protocol. (Contribuição de Jelle Zijlstra em gh-104873.)

  • Adiciona is_protocol() para verificar se uma classe é uma Protocol. (Contribuição de Jelle Zijlstra em gh-104873.)

  • ClassVar agora pode ser aninhado em Final, e vice-versa. (Contribuição de Mehdi Drissi em gh-89547.)

unicodedata

venv

  • Adiciona suporte para criar arquivos ignorados pelo gerenciamento de controle de fontes (SCM) no diretório de um ambiente virtual. Por padrão, o Git é compatível. Isso está implementado como ativado por padrão por meio da API, que pode ser estendido para oferecer suporte a outros SCMs (EnvBuilder e create()) e desativado por padrão por meio da CLI, usando --without-scm-ignore-files. (Contribuição de Brett Cannon em gh-108125.)

warnings

xml

zipimport

  • Adiciona suporte para arquivos no formato ZIP64. Todo mundo adora dados enormes, certo? (Contribuição de Tim Hatch em gh-94146.)

Otimizações

  • Vários módulos de biblioteca padrão tiveram seus tempos de importação significativamente melhorados. Por exemplo, o tempo de importação do módulo typing foi reduzido em cerca de um terço pela remoção de dependências em re e contextlib. Outros módulos para aproveitar a aceleração no tempo de importação incluem email.utils, enum, functools, importlib.metadata e threading. (Contribuição de Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas e outros em gh-109653.)

  • textwrap.indent() agora é cerca de 30% mais rápido do que antes para entradas grandes. (Contribuição de Inada Naoki em gh-107369.)

  • O módulo subprocess agora a função posix_spawn() em mais situações, incluindo quando close_fds é True (o padrão) em muitas plataformas. Isto deve fornecer um aumento notável de desempenho ao iniciar processos no FreeBSD e Solaris. Veja a seção de subprocess acima para detalhes. (Contribuição de Jakub Kulik em gh-113117.)

Módulos e APIs removidas

PEP 594: remove “baterias descarregadas” da biblioteca padrão

PEP 594 propôs remover 19 módulos da biblioteca padrão, coloquialmente chamados de “baterias descarregadas” devido ao seu status histórico, obsoleto ou inseguro. Todos os módulos a seguir foram descontinuados no Python 3.11 e agora foram removidos:

  • aifc

  • audioop

  • chunk

  • cgi e cgitb

    • cgi.FieldStorage normalmente pode ser substituído por urllib.parse.parse_qsl() para solicitações GET e HEAD, e o módulo email.message ou a biblioteca multipart para solicitações POST e PUT.

    • cgi.parse() pode ser substituído chamando urllib.parse.parse_qs() diretamente na string de consulta desejada, a menos que a entrada seja multipart/form-data, que deve ser substituída conforme descrito abaixo para cgi.parse_multipart().

    • cgi.parse_header() pode ser substituído pela funcionalidade do pacote email, que implementa os mesmos RFCs MIME. Por exemplo, com email.message.EmailMessage:

      from email.message import EmailMessage
      
      msg = EmailMessage()
      msg['content-type'] = 'application/json; charset="utf8"'
      main, params = msg.get_content_type(), msg['content-type'].params
      
    • cgi.parse_multipart() pode ser substituído pela funcionalidade no pacote email, que implementa os mesmos RFCs de MIME, ou pela biblioteca multipart. Por exemplo, as classes email.message.EmailMessage e email.message.Message.

  • crypt e a extensão privada _crypt. O módulo hashlib pode ser uma substituição apropriada quando simplesmente fazer hash de um valor é necessário. Caso contrário, várias bibliotecas de terceiros no PyPI estão disponíveis:

    • bcrypt: hashing de senha moderno para seu software e servidores.

    • passlib: framework abrangente de hash de senha com suporte para mais de 30 esquemas.

    • argon2-cffi: algoritmo seguro de hashing de senha Argon2.

    • legacycrypt: envólucro ao ctypes para a chamada POSIX da biblioteca de criptografia e funcionalidade associada.

    • crypt_r: fork do módulo crypt, um envólucro para a chamada da biblioteca crypt_r(3) e funcionalidade associada.

  • imghdr: as bibliotecas filetype, puremagic ou python-magic devem ser usadas como substituições. Por exemplo, a função puremagic.what() pode ser usada para substituir a função imghdr.what() para todos os formatos de arquivo que tinham suporte de imghdr.

  • mailcap: use o módulo mimetypes.

  • msilib

  • nis

  • nntplib: use a biblioteca pynntp do PyPI.

  • ossaudiodev: para reprodução de áudio, use a biblioteca pygame do PyPI.

  • pipes: Use o módulo subprocess em vez disso. Use shlex.quote() para substituir a função não documentada pipes.quote.

  • sndhdr: as bibliotecas filetype, puremagic ou python-magic devem ser usadas como substitutas.

  • spwd: use a biblioteca python-pam do PyPI.

  • sunau

  • telnetlib: use as bibliotecas telnetlib3 ou Exscript do PyPI.

  • uu: use o módulo base64 como uma alternativa moderna.

  • xdrlib

(Contribuição de Victor Stinner e Zachary Ware em gh-104773 e gh-104780.)

2to3

  • Remove o programa 2to3 e o módulo lib2to3, já descontinuados no Python 3.11. (Contribuição de Victor Stinner em gh-104780.)

embutidos

  • Remove suporte aos descritores classmethod encadeados (introduzidos em gh-63272). Eles não podem mais serem usados para agrupar outros descritores como property. O design central desse recurso apresentava falhas e levou a problemas. Para “passar” um classmethod, considere usar o atributo __wrapped__ que foi adicionado no Python 3.10. (Contribuição de Raymond Hettinger em gh-89519.)

  • Chamar frame.clear() em um quadro suspenso levanta RuntimeError (como sempre foi o caso para um quadro em execução). (Contribuição de Irit Katriel em gh-79932.)

configparser

  • Remove a classe não documentada LegacyInterpolation, descontinuada na docstring desde Python 3.2 e em tempo de execução desde Python 3.11. (Contribuição de Hugo van Kemenade em gh-104886.)

importlib.metadata

locale

  • Remove a função locale.resetlocale(), descontinuada no Python 3.11. Use locale.setlocale(locale.LC_ALL, ""). (Contribuição de Victor Stinner em gh-104783.)

opcode

  • Move opcode.ENABLE_SPECIALIZATION para _opcode.ENABLE_SPECIALIZATION. Este campo foi adicionado na versão 3.12, nunca foi documentado e não se destina ao uso externo. (Contribuição de Irit Katriel em gh-105481.)

  • Remove opcode.is_pseudo(), opcode.MIN_PSEUDO_OPCODE e opcode.MAX_PSEUDO_OPCODE, que foram adicionados no Python 3.12, mas nunca foram documentados nem expostos através de dis, e não foram planejados para serem usados externamente. (Contribuição de Irit Katriel em gh-105481.)

pathlib

  • Remove a capacidade de usar objetos Path como gerenciadores de contexto. Essa funcionalidade foi descontinuada e não tinha efeito desde o Python 3.9. (Contribuição de Barney Gale em gh-83863.)

re

  • Remove a função re.template() não documentada, descontinuada e quebrada e o sinalizador re.TEMPLATE / re.T. (Contribuição de Serhiy Storchaka e Nikita Sobolev em gh-105687.)

tkinter.tix

  • Remove o módulo tkinter.tix, descontinuado no Python 3.6. A biblioteca Tix de terceiros que o módulo empacota não é mantida. (Contribuição de Zachary Ware em gh-75552.)

turtle

  • Remove o método RawTurtle.settiltangle(), descontinuado na documentação desde o Python 3.1 e em tempo de execução desde o Python 3.11. (Contribuição de Hugo van Kemenade em gh-104876.)

typing

  • Remove os espaços de nomes typing.io e typing.re, descontinuados desde o Python 3.8. Os itens nesses espaços de nomes podem ser importados diretamente do módulo typing. (Contribuição de Sebastian Rittau em gh-92871.)

  • Remove o método de argumento nomeado de criação de tipos TypedDict, descontinuados no Python 3.11. (Contribuição de Tomas Roun em gh-104786.)

unittest

urllib

webbrowser

  • Remove a classe MacOSX não testada e não documentada, descontinuada no Python 3.11. Use a classe MacOSXOSAScript (introduzida no Python 3.2). (Contribuição de Hugo van Kemenade em gh-104804.)

  • Remove o atributo descontinuado MacOSXOSAScript._name. Use o atributo MacOSXOSAScript.name. (Contribuição de Nikita Sobolev em gh-105546.)

Novas descontinuações

  • Funções definidas pelo usuário:

    • A atribuição ao atributo __code__ de uma função onde o tipo do novo objeto código não corresponde ao tipo da função está descontinuada. Os diferentes tipos são: função simples, gerador, gerador assíncrono e corrotina. (Contribuição de Irit Katriel em gh-81137.)

  • array:

    • Descontinua o código de formato 'u' (wchar_t). Este código de formato foi descontinuado na documentação desde o Python 3.3 e será removido no Python 3.16. Use o código de formato 'w' (Py_UCS4) para caracteres Unicode. (Contribuição de Hugo van Kemenade em gh-80480.)

  • ctypes:

    • Descontinua a função não documentada SetPointerType(), que será removida no Python 3.15. (Contribuição de Victor Stinner em gh-105733.)

    • Descontinua suavemente a função ARRAY() em favor da multiplicação type * length. (Contribuição de Victor Stinner em gh-105733.)

  • decimal:

    • Descontinua o especificador de formato de Decimal não padrão e não documentado 'N', que só é suportado na implementação C do módulo decimal. (Contribuição de Serhiy Storchaka em gh-89902.)

  • dis:

    • Descontinua o separador HAVE_ARGUMENT. Em vez disso, Verifique a associação em hasarg. (Contribuição de Irit Katriel em gh-109319.)

  • getopt e optparse:

    • Ambos os módulos agora estão suavemente descontinuados, com argparse preferido para novos projetos. Esta é uma nova descontinuação suave para o módulo getopt, enquanto o módulo optparse já estava de fato suavemente descontinuado. (Contribuição de Victor Stinner em gh-106535.)

  • gettext:

    • Descontinua números não inteiros como argumentos para funções e métodos que consideram formas plurais no módulo gettext, ainda que nenhuma tradução tenha sido encontrada. (Contribuição de Serhiy Storchaka em gh-88434.)

  • glob:

    • Descontinua as funções não documentadas glob0() e glob1(). Em vez disso, use glob() e passe um objeto caminho ou similar especificando o diretório raiz para o parâmetro root_dir. (Contribuição de Barney Gale em gh-117337.)

  • http.server:

    • Descontinua CGIHTTPRequestHandler, a ser removido no Python 3.15. Servidores HTTP CGI baseados em processos estão fora de moda há muito tempo. Este código estava desatualizado, sem manutenção e raramente era usado. Ele tem um alto potencial para bugs de segurança e funcionalidade. (Contribuição de Gregory P. Smith em gh-109096.)

    • Descontinua o sinalizador --cgi para a interface de linha de comando python -m http.server, a ser removido no Python 3.15. (Contribuição de Gregory P. Smith em gh-109096.)

  • mimetypes:

  • re:

    • Descontinua a passagem dos argumentos opcionais maxsplit, count ou flags como argumentos posicionais para as funções de nível de módulo split(), sub() e subn(). Esses parâmetros se tornarão somente-nomeados em uma versão futura do Python. (Contribuição de Serhiy Storchaka em gh-56166.)

  • pathlib:

  • platform:

    • Descontinua java_ver(), a ser removida no Python 3.15. Esta função é útil apenas para suporte a Jython, tem uma API confusa e é amplamente não testada. (Contribuição de Nikita Sobolev em gh-116349.)

  • pydoc:

    • Descontinua a função não documentada ispackage(). (Contribuição de Zackery Spytz em gh-64020.)

  • sqlite3:

  • sys:

  • tarfile:

    • Descontinua o atributo TarFile.tarfile não documentado e não utilizado, a ser removido no Python 3.16. (Contribuição em gh-115256.)

  • traceback:

  • typing:

    • Descontinua a não-documentada sintaxe de argumento nomeado para criação de classes NamedTuple (por exemplo, Point = NamedTuple("Point", x=int, y=int)), para ser removido no Python 3.15. Em vez disso, use as sintaxes baseada em classe ou a funcional. (Contribuição de Alex Waygood in gh-105566.)

    • Descontinua a omissão do parâmetro fields ao criar uma classe NamedTuple ou typing.TypedDict e descontinua a passagem de None para o parâmetro fields de ambos os tipos. O Python 3.15 exigirá uma sequência válida para o parâmetro fields. Para criar uma classe NamedTuple com zero campos, use class NT(NamedTuple): pass ou NT = NamedTuple("NT", ()). Para criar uma classe TypedDict com zero campos, use class TD(TypedDict): pass ou TD = TypedDict("TD", {}). (Contribuição de Alex Waygood em gh-105566 e gh-105570.)

    • Descontinua o decorador de função typing.no_type_check_decorator() para ser removido no Python 3.15. Depois de oito anos no módulo typing, ele ainda não foi implementado por nenhum dos principais verificadores de tipos. (Contribuição de Alex Waygood em gh-106309.)

    • Descontinua typing.AnyStr. No Python 3.16, isso será removido de typing.__all__, e uma DeprecationWarning será levantada em tempo de execução quando isso for importado ou acessado. Será removido completamente em Python 3.18. Em vez disso, use a nova sintaxe de parâmetro de tipo. (Contribuição de Michael The em gh-107116.)

  • wave:

Remoção pendente no Python 3.14

Remoção pendente no Python 3.15

  • O sistema de importação:

    • A definição de __cached__ em um módulo enquanto falha na definição de __spec__.loader está descontinuado. No Python 3.15, __cached__ deixará de ser definido ou levado em consideração pelo sistema de importação ou pela biblioteca padrão. (gh-97879)

    • A definição de __package__ em um módulo enquanto falha na definição de __spec__.parent está descontinuado. No Python 3.15, __package__ deixará de ser definido ou levado em consideração pelo sistema de importação ou pela biblioteca padrão. (gh-97879)

  • ctypes:

    • A função não documentada ctypes.SetPointerType() foi descontinuada desde o Python 3.13.

  • http.server:

    • A classe obsoleta e raramente usada CGIHTTPRequestHandler foi descontinuada desde o Python 3.13. Não existe substituição direta. Qualquer coisa é melhor que CGI para fazer a interface de um servidor web com um manipulador de requisição.

    • O sinalizador --cgi para a interface de linha de comando python -m http.server foi descontinuado desde o Python 3.13.

  • locale:

  • pathlib:

  • platform:

    • java_ver() foi descontinuada desde o Python 3.13. Esta função é útil apenas para suporte Jython, tem uma API confusa e é amplamente não testada.

  • threading:

    • RLock() não aceitará argumentos no Python 3.15. A passagem quaisquer argumentos foi descontinuada desde o Python 3.14, pois a versão Python não permite nenhum argumento, mas a versão C permite qualquer número de argumentos posicionais ou nomeados, ignorando todos os argumentos.

  • types:

  • typing:

    • A não-documentada sintaxe de argumento nomeado para criar classes NamedTuple (por exemplo, Point = NamedTuple("Point", x=int, y=int)) foi descontinuada desde o Python 3.13. Em vez disso, use as sintaxes baseada em classe ou funcional.

    • A função decoradora typing.no_type_check_decorator() foi descontinuada desde o Python 3.13. Após oito anos no módulo typing, ela ainda não foi suportada por nenhum verificador de tipo importante.

  • wave:

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__.loader está 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:

    • O código de formato 'u' (wchar_t) foi descontinuado na documentação desde o Python 3.3 e do ambiente de execução desde o Python 3.13. Em vez disso, use o código de formato 'w' (Py_UCS4) para caracteres Unicode.

  • asyncio:

  • builtins:

    • A inversão bit a bit em tipos booleanos, ~True ou ~False foi descontinuada desde o Python 3.12, pois produz resultados surpreendentes e não intuitivos (-2 e -1). Em vez disso, use not x para a negação lógica de um booleano. No caso raro de você precisar da inversão bit a bit do inteiro subjacente, converta para int explicitamente (~int(x)).

  • shutil:

    • A exceção ExecError foi descontinuada desde o Python 3.14. Ela não foi usada por nenhuma função em shutil desde o Python 3.4, e agora é um alias de RuntimeError.

  • symtable:

  • sys:

  • tarfile:

    • O atributo não documentado e não utilizado TarFile.tarfile foi descontinuado desde o Python 3.13.

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.

  • código de formatação 'u' do array (gh-57281)

  • builtins:

    • bool(NotImplemented).

    • Geradores: a assinatura throw(type, exc, tb) e athrow(type, exc, tb) está descontinuada: use throw(exc) e athrow(exc), a assinatura com um único argumento.

    • 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 reservadas and, else, for, if, in , is e or. 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 de int.

    • Suporte para o método __float__() retornando uma subclasse estrita de float: esses métodos serão necessários para retornar uma instância de float.

    • Suporte para o método __complex__() retornando uma subclasse estrita de complex: esses métodos serão necessários para retornar uma instância de complex.

    • 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 constantes calendar.January e calendar.February foram descontinuadas e substituídas por calendar.JANUARY e calendar.FEBRUARY. (Contribuição de Prince Roshan em gh-103636.)

  • codeobject.co_lnotab: use o método codeobject.co_lines().

  • datetime:

    • utcnow(): use datetime.datetime.now(tz=datetime.UTC).

    • utcfromtimestamp(): use datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC).

  • gettext: o valor de plural deve ser um número inteiro.

  • importlib:

    • Método load_module(): use exec_module().

    • O parâmetro debug_override de cache_from_source() foi descontinuado: use o parâmetro optimization.

  • importlib.metadata:

    • Interface de tupla EntryPoints.

    • None implícito nos valores de retorno.

  • logging: o método warn() foi descontinuado desde o Python 3.3, use warning().

  • mailbox: o uso da entrada StringIO e do modo de texto foi descontinuado, use BytesIO e o modo binário.

  • os: chamar os.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_constants e sre_parse.

  • shutil: o parâmetro onerror de rmtree() foi descontinuado no Python 3.12; use o parâmetro onexc.

  • Protocolos e opções de ssl

    • ssl.SSLContext sem argumento de protocolo foi descontinuado.

    • ssl.SSLContext: set_npn_protocols() e selected_npn_protocol() foram descontinuados, use ALPN.

    • Opções de ssl.OP_NO_SSL*

    • Opções de ssl.OP_NO_TLS*

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • O parâmetro check_home de sysconfig.is_python_build() foi descontinuado e é ignorado.

  • Métodos de threading:

  • typing.Text (gh-92332).

  • unittest.IsolatedAsyncioTestCase: foi descontinuado retornar um valor que não seja None de um caso de teste.

  • Funções descontinuadas de urllib.parse: use urlparse()

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • urllib.request: o estilo de URLopener e FancyURLopener de invocar solicitações foi descontinuado. Use as mais novas funções e métodos urlopen().

  • wsgiref: SimpleHandler.stdout.write() não deve fazer gravações parciais.

  • xml.etree.ElementTree: testar o valor verdade de um Element está descontinuado. Em um lançamento futuro isso sempre retornará True. Em vez disso, prefira os testes explícitos len(elem) ou elem is not None.

  • zipimport.zipimporter.load_module() foi descontinuado: use exec_module().

Alterações de bytecode do CPython

  • O oparg de YIELD_VALUE agora é 1 se o yield fizer parte de um yield-from ou um await, e 0 caso contrário. O oparg de RESUME foi alterado para adicionar um bit indicando se a profundidade de exceção é 1, o que é necessário para otimizar o fechamento dos geradores. (Contribuição de Irit Katriel em gh-111354.)

Alterações na API C

Novas funcionalidades

Alterações na API C

Mudanças na API C Limitada

APIs C removidas

  • Remove diversas funções, macros, variáveis, etc com nomes prefixados por _Py ou _PY (consideradas como API privada). Se o seu projeto for afetado por uma dessas remoções e você acreditar que a API removida deve permanecer disponível, por favor abra um novo relatório de problema para solicitar uma API C pública e adicione cc: @vstinner ao problema para notificar Victor Stinner. (Contribuição de Victor Stinner em gh-106320.)

  • Remove protocolos de buffer antigos descontinuados no Python 3.0: use Protocolo de Buffer.

    • PyObject_CheckReadBuffer(): use PyObject_CheckBuffer() para testar se o objeto oferece suporte ao protocolo de buffer. Observe que PyObject_CheckBuffer() não garante que PyObject_GetBuffer() terá sucesso. Para testar se o objeto é realmente legível, veja o próximo exemplo de PyObject_GetBuffer().

    • PyObject_AsCharBuffer(), PyObject_AsReadBuffer(): use PyObject_GetBuffer() e PyBuffer_Release():

      Py_buffer view;
      if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
          return NULL;
      }
      // Usa `view.buf` e `view.len` para ler do buffer.
      // Você pode precisar converter buf como `(const char*)view.buf`.
      PyBuffer_Release(&view);
      
    • PyObject_AsWriteBuffer(): use PyObject_GetBuffer() e PyBuffer_Release():

      Py_buffer view;
      if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
          return NULL;
      }
      // Usa `view.buf` e `view.len` para gravar no buffer.
      PyBuffer_Release(&view);
      

    (Contribuição de Inada Naoki in gh-85275.)

  • Remove diversas funções descontinuadas no Python 3.9:

    (Contribuição de Victor Stinner em gh-105107.)

  • Remove as seguintes funções antigas da configuração de inicialização do Python, descontinuadas no Python 3.11:

    Em vez disso, use a nova API PyConfig da Configuração de Inicialização do Python (PEP 587), adicionada ao Python 3.8. (Contribuição de Victor Stinner em gh-105145.)

  • Remove as funções PyEval_AcquireLock() e PyEval_ReleaseLock(), descontinuadas no Python 3.2. Eles não atualizavam o estado atual da thread. Elas podem ser substituídas por:

    (Contribuição de Victor Stinner em gh-105182.)

  • Remove a função PyEval_ThreadsInitialized(), descontinuada no Python 3.9. Desde Python 3.7, Py_Initialize() sempre cria a GIL: chamar PyEval_InitThreads() não faz nada e PyEval_ThreadsInitialized() sempre retorna diferente de zero. (Contribuição de Victor Stinner em gh-105182.)

  • Remove o apelido _PyInterpreterState_Get() de PyInterpreterState_Get() que era mantido para compatibilidade com versões anteriores do Python 3.8. O projeto pythoncapi-compat pode ser usado para obter PyInterpreterState_Get() no Python 3.8 e versões anteriores. (Contribuição de Victor Stinner em gh-106320.)

  • Remove a função privada _PyObject_FastCall(): use PyObject_Vectorcall(), a qual está disponível desde Python 3.8 (PEP 590). (Contribuição de Victor Stinner em gh-106023.)

  • Remove o arquivo de cabeçalho cpython/pytime.h, que continha apenas funções privadas. (Contribuição de Victor Stinner em gh-106316.)

  • Remove a constante ​​não documentada PY_TIMEOUT_MAX da API C limitada. (Contribuição de Victor Stinner em gh-110014.)

  • Remove as antigas macros de trashcan Py_TRASHCAN_SAFE_BEGIN e Py_TRASHCAN_SAFE_END. Substitua ambas pelas novas macros Py_TRASHCAN_BEGIN e Py_TRASHCAN_END. (Contribuição de Irit Katriel em gh-105111.)

APIs C descontinuadas

Remoção pendente no Python 3.14

Remoção pendente no Python 3.15

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.

Mudanças na construção

  • arm64-apple-ios e arm64-apple-ios-simulator são agora plataformas de nível 3 da PEP 11. (Escrita e implementação da PEP 730 foi uma contribuição de Russell Keith-Magee em gh-114099.)

  • aarch64-linux-android e x86_64-linux-android são agora plataformas de nível 3 da PEP 11. (Escrita e implementação da PEP 738 foi uma contribuição de Malcolm Smith em gh-116622.)

  • wasm32-wasi agora é uma plataforma de nível 2 segundo a PEP 11. (Contribuição de Brett Cannon em gh-115192.)

  • wasm32-emscripten não é mais uma plataforma suportada pela PEP 11. (Contribuição de Brett Cannon em gh-115192.)

  • Construir CPython agora requer um compilador com suporte para a biblioteca atômica C11, funções atômicas embutidas do GCC ou intrínsecos interligados MSVC.

  • Autoconf 2.71 e aclocal 1.16.5 agora são necessários para regerar o script configure. (Contribuição de Christian Heimes em gh-89886 e de Victor Stinner em gh-112090.)

  • SQLite 3.15.2 ou mais recente é necessário para construir o módulo de extensão sqlite3. (Contribuição de Erlend Aasland em gh-105875.)

  • CPython agora inclui a biblioteca mimalloc por padrão. Está licenciada sob a licença do MIT; veja licença do mimalloc. O mimalloc incluído tem alterações personalizadas, veja gh-113141 para detalhes. (Contribuição de Dino Viehland em gh-109914.)

  • A opção --with-system-libmpdec do configure agora tem como padrão yes. A cópia empacotada de libmpdecimal será removida no Python 3.15.

  • Python construído com --with-trace-refs (referências de rastreamento) do configure tem compatibilidade de ABI com a construção de lançamento do Python e a construção de depuração. (Contribuição de Victor Stinner em gh-108634.)

  • Em sistemas POSIX, os nomes de arquivos pkg-config (.pc) agora incluem os sinalizadores de ABI. Por exemplo, a construção com threads livres gera python-3.13t.pc e a construção de depuração gera python-3.13d.pc.

  • As extensões C errno, fcntl, grp, md5, pwd, resource, termios, winsound, _ctypes_test, _multiprocessing.posixshmem, _scproxy, _stat, _statistics, _testconsole, _testimportmultiple e _uuid são agora construídas com a API C limitada. (Contribuição de Victor Stinner em gh-85283.)

Portando para o Python 3.13

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

  • PEP 667 introduz várias mudanças na semântica de locals() e f_locals:

    • Chamar locals() em um escopo otimizado agora produz uma captura independente em cada chamada e, portanto, não atualiza mais implicitamente as referências retornadas anteriormente. Obter o comportamento legado do CPython agora requer chamadas explícitas para atualizar o dicionário inicialmente retornado com os resultados de chamadas subsequentes para locals(). Funções de execução de código que visam implicitamente locals() (como exec e eval) devem receber um espaço de nomes explícito para acessar seus resultados em um escopo otimizado. (Alterado como parte da PEP 667.)

    • Chamar locals() de uma compreensão no módulo ou escopo de classe (inclusive via exec ou eval) mais uma vez se comporta como se a compreensão estivesse sendo executada como uma função aninhada independente (isto é, as variáveis ​​locais de o escopo que contém não está incluído). No Python 3.12, isso mudou para incluir as variáveis ​​locais do escopo que o contém ao implementar a PEP 709. (Alterado como parte da PEP 667.)

    • Acessar FrameType.f_locals em um escopo otimizado agora retorna um proxy de “write-through” em vez de uma captura que é atualizado em horários mal especificados. Se uma captura for desejada, ela deve ser criada explicitamente com dict ou com o método .copy() do proxy. (Alterado como parte da PEP 667.)

  • functools.partial agora emite uma FutureWarning quando é usado como método. Seu comportamento será alterado em versões futuras do Python. Envolva-a em staticmethod() se quiser preservar o comportamento antigo. (Contribuição de Serhiy Storchaka em gh-121027.)

  • Uma exceção OSError agora é levantada por getpass.getuser() para qualquer falha na recuperação de um nome de usuário, em vez de ImportError em plataformas não-Unix ou KeyError em plataformas Unix onde o banco de dados de senhas está vazio.

  • O valor do atributo mode de gzip.GzipFile agora é uma string ('rb' ou 'wb') e não mais um inteiro (1 ou 2). O valor do atributo mode do objeto arquivo ou similar legível retornado por zipfile.ZipFile.open() é agora 'rb' e não mais 'r'. (Contribuição de Serhiy Storchaka em gh-115961.)

  • mailbox.Maildir agora ignora arquivos com um ponto inicial (.). (Contribuição de Zackery Spytz em gh-65559.)

  • pathlib.Path.glob() e rglob() agora retornam arquivos e diretórios se um padrão que termina com “**” for fornecido, em vez de apenas diretórios. Os usuários podem adicionar uma barra final para manter o comportamento anterior e corresponder apenas aos diretórios.

  • O módulo threading agora espera que o módulo _thread tenha uma função _is_main_interpreter. É uma função sem argumentos que retorna True se o interpretador atual for o interpretador principal.

    Qualquer biblioteca ou aplicação que forneça um módulo _thread personalizado deve obrigatoriamente fornecer _is_main_interpreter(), da mesma forma que outros atributos “privados” do módulo. (Veja gh-112826.)

Alterações na API C

  • Python.h não inclui mais o cabeçalho padrão <ieeefp.h>. Ele foi incluído para a função finite() que agora é fornecida pelo cabeçalho <math.h>. Agora deve ser incluído explicitamente, se necessário. Remove também a macro HAVE_IEEEFP_H. (Contribuição de Victor Stinner em gh-108765.)

  • Python.h não inclui mais estes arquivos de cabeçalho padrão: <time.h>, <sys/select.h> e <sys/time.h>. Se necessário, deverão agora ser incluídos explicitamente. Por exemplo, <time.h> fornece as funções clock() e gmtime(), <sys/select.h> fornece o select(), e <sys/time.h> fornece as funções futimes(), gettimeofday() e setitimer(). (Contribuição de Victor Stinner em gh-108765.)

  • No Windows, Python.h não inclui mais o arquivo de cabeçalho padrão <stddef.h>. Se necessário, deverá agora ser incluído explicitamente. Por exemplo, ele fornece a função offsetof() e os tipos size_t e ptrdiff_t. Incluindo <stddef.h> explicitamente já era necessário para todas as outras plataformas, a macro HAVE_STDDEF_H só é definida no Windows. (Contribuição de Victor Stinner em gh-108765.)

  • Se a macro Py_LIMITED_API estiver definida, as macros Py_BUILD_CORE, Py_BUILD_CORE_BUILTIN e Py_BUILD_CORE_MODULE agora são indefinidas por <Python.h>. (Contribuição de Victor Stinner em gh-85283.)

  • As macros antigas da lixeira Py_TRASHCAN_SAFE_BEGIN e Py_TRASHCAN_SAFE_END foram removidas. Elas devem ser substituídas pelas novas macros Py_TRASHCAN_BEGIN e Py_TRASHCAN_END.

    Uma função tp_dealloc que contém as macros antigas, como:

    static void
    dealocador_de_meutipo(meutipo *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END
    }
    

    deve migrar para as novas macros da seguinte forma:

    static void
    dealocador_de_meutipo(meutipo *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, dealocador_de_meutipo);
        ...
        Py_TRASHCAN_END
    }
    

    Observe que Py_TRASHCAN_BEGIN tem um segundo argumento que deve ser a função de desalocação em que está. As novas macros foram adicionadas no Python 3.8 e as macros antigas foram descontinuadas no Python 3.11. (Contribuição de Irit Katriel em gh-105111.)

  • PEP 667 introduz várias mudanças em funções relacionadas a quadro:

    • Os efeitos da mutação do dicionário retornado de PyEval_GetLocals() em um escopo otimizado foram alterados. Novas entradas de dict adicionadas desta forma agora apenas ficarão visíveis para chamadas PyEval_GetLocals() subsequentes nesse quadro, como PyFrame_GetLocals(), locals() e FrameType.f_locals não acessa mais o mesmo dicionário armazenado em cache subjacente. As alterações feitas nas entradas para nomes de variáveis ​​reais e nomes adicionados através das interfaces proxy de “write-through” serão substituídas em chamadas subsequentes para PyEval_GetLocals() nesse quadro. A atualização de código recomendada depende de como a função estava sendo usada, portanto, consulte o aviso de descontinuação na função para obter detalhes.

    • Chamar PyFrame_GetLocals() em um escopo otimizado agora retorna um proxy de “write-through” em vez de uma captura que é atualizada em horários mal especificados. Se uma captura for desejada, ela deve ser criada explicitamente (por exemplo, com PyDict_Copy()) ou chamando a nova API PyEval_GetFrameLocals().

    • PyFrame_FastToLocals() e PyFrame_FastToLocalsWithError() não têm mais nenhum efeito. Chamar essas funções tem sido redundante desde o Python 3.11, quando PyFrame_GetLocals() foi introduzido pela primeira vez.

    • PyFrame_LocalsToFast() não tem mais efeito. Chamar esta função é redundante agora que PyFrame_GetLocals() retorna um proxy de “write-through” para escopos otimizados.

Mudanças em teste de regressão

  • Python construído com --with-pydebug do configure agora oferece suporte a uma opção de linha de comando -X presite=pacote.módulo. Se usado, especifica um módulo que deve ser importado no início do ciclo de vida do interpretador, antes que site.py seja executado. (Contribuição de Łukasz Langa em gh-110769.)

Alterações notáveis no 3.13.1

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.