O que há de novo no Python 3.14

Editor:

Hugo van Kemenade

Esse artigo explica os novos recursos no Python 3.14. comparado ao 3.13.

Para detalhes completos, veja o changelog.

Ver também

PEP 745 – Cronograma de lançamento do Python 3.14

Nota

Os usuários de pré-lançamento devem estar cientes de que este documento está atualmente em forma de rascunho. Ele será atualizado substancialmente à medida que o Python 3.14 caminha para seu lançamento estável, portanto vale a pena conferir mesmo depois de ler as versões anteriores.

Resumo – destaques da versão

O Python 3.14 beta é o pré-lançamento da próxima versão da linguagem de programação Python, com uma mistura de alterações na linguagem, na implementação e na biblioteca padrão.

The biggest changes to the implementation include template strings (PEP 750), deferred evaluation of annotations (PEP 649), and a new type of interpreter that uses tail calls.

The library changes include the addition of a new annotationlib module for introspecting and wrapping annotations (PEP 649), a new compression.zstd module for Zstandard support (PEP 784), plus syntax highlighting in the REPL, as well as the usual deprecations and removals, and improvements in user-friendliness and correctness.

Incompatible changes

On platforms other than macOS and Windows, the default start method for multiprocessing and ProcessPoolExecutor switches from fork to forkserver.

See (1) and (2) for details.

If you encounter NameErrors or pickling errors coming out of multiprocessing or concurrent.futures, see the forkserver restrictions.

The interpreter avoids some reference count modifications internally when it’s safe to do so. This can lead to different values returned from sys.getrefcount() and Py_REFCNT() compared to previous versions of Python. See below for details.

New features

PEP 750: Template strings

Template string literals (t-strings) are a generalization of f-strings, using a t in place of the f prefix. Instead of evaluating to str, t-strings evaluate to a new string.templatelib.Template type:

from string.templatelib import Template

name = "World"
template: Template = t"Hello {name}"

The template can then be combined with functions that operate on the template’s structure to produce a str or a string-like result. For example, sanitizing input:

evil = "<script>alert('evil')</script>"
template = t"<p>{evil}</p>"
assert html(template) == "<p>&lt;script&gt;alert('evil')&lt;/script&gt;</p>"

As another example, generating HTML attributes from data:

attributes = {"src": "shrubbery.jpg", "alt": "looks nice"}
template = t"<img {attributes}>"
assert html(template) == '<img src="shrubbery.jpg" alt="looks nice" class="looks-nice">'

Compared to using an f-string, the html function has access to template attributes containing the original information: static strings, interpolations, and values from the original scope. Unlike existing templating approaches, t-strings build from the well-known f-string syntax and rules. Template systems thus benefit from Python tooling as they are much closer to the Python language, syntax, scoping, and more.

Writing template handlers is straightforward:

from string.templatelib import Template, Interpolation

def lower_upper(template: Template) -> str:
    """Render static parts lowercased and interpolations uppercased."""
    parts: list[str] = []
    for item in template:
        if isinstance(item, Interpolation):
            parts.append(str(item.value).upper())
        else:
            parts.append(item.lower())
    return "".join(parts)

name = "world"
assert lower_upper(t"HELLO {name}") == "hello WORLD"

With this in place, developers can write template systems to sanitize SQL, make safe shell operations, improve logging, tackle modern ideas in web development (HTML, CSS, and so on), and implement lightweight, custom business DSLs.

(Contributed by Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, and Pablo Galindo Salgado in gh-132661.)

Ver também

PEP 750.

PEP 768: Safe external debugger interface for CPython

PEP 768 introduces a zero-overhead debugging interface that allows debuggers and profilers to safely attach to running Python processes. This is a significant enhancement to Python’s debugging capabilities allowing debuggers to forego unsafe alternatives. See below for how this feature is leveraged to implement the new pdb module’s remote attaching capabilities.

The new interface provides safe execution points for attaching debugger code without modifying the interpreter’s normal execution path or adding runtime overhead. This enables tools to inspect and interact with Python applications in real-time without stopping or restarting them — a crucial capability for high-availability systems and production environments.

For convenience, CPython implements this interface through the sys module with a sys.remote_exec() function:

sys.remote_exec(pid, script_path)

This function allows sending Python code to be executed in a target process at the next safe execution point. However, tool authors can also implement the protocol directly as described in the PEP, which details the underlying mechanisms used to safely attach to running processes.

Here’s a simple example that inspects object types in a running Python process:

import os
import sys
import tempfile

# Create a temporary script
with tempfile.NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
    script_path = f.name
    f.write(f"import my_debugger; my_debugger.connect({os.getpid()})")
try:
    # Execute in process with PID 1234
    print("Behold! An offering:")
    sys.remote_exec(1234, script_path)
finally:
    os.unlink(script_path)

The debugging interface has been carefully designed with security in mind and includes several mechanisms to control access:

A key implementation detail is that the interface piggybacks on the interpreter’s existing evaluation loop and safe points, ensuring zero overhead during normal execution while providing a reliable way for external processes to coordinate debugging operations.

(Contributed by Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic in gh-131591.)

Ver também

PEP 768.

PEP 784: Adding Zstandard to the standard library

The new compression package contains modules compression.lzma, compression.bz2, compression.gzip and compression.zlib which re-export the lzma, bz2, gzip and zlib modules respectively. The new import names under compression are the canonical names for importing these compression modules going forward. However, the existing modules names have not been deprecated. Any deprecation or removal of the existing compression modules will occur no sooner than five years after the release of 3.14.

The new compression.zstd module provides compression and decompression APIs for the Zstandard format via bindings to Meta’s zstd library. Zstandard is a widely adopted, highly efficient, and fast compression format. In addition to the APIs introduced in compression.zstd, support for reading and writing Zstandard compressed archives has been added to the tarfile, zipfile, and shutil modules.

Here’s an example of using the new module to compress some data:

from compression import zstd
import math

data = str(math.pi).encode() * 20

compressed = zstd.compress(data)

ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of {ratio}")

As can be seen, the API is similar to the APIs of the lzma and bz2 modules.

(Contributed by Emma Harper Smith, Adam Turner, Gregory P. Smith, Tomas Roun, Victor Stinner, and Rogdham in gh-132983)

Ver também

PEP 784.

Remote attaching to a running Python process with PDB

The pdb module now supports remote attaching to a running Python process using a new -p PID command-line option:

python -m pdb -p 1234

This will connect to the Python process with the given PID and allow you to debug it interactively. Notice that due to how the Python interpreter works attaching to a remote process that is blocked in a system call or waiting for I/O will only work once the next bytecode instruction is executed or when the process receives a signal.

This feature uses PEP 768 and the sys.remote_exec() function to attach to the remote process and send the PDB commands to it.

(Contributed by Matt Wozniski and Pablo Galindo in gh-131591.)

Ver também

PEP 768.

PEP 758 – Allow except and except* expressions without parentheses

The except and except* expressions now allow parentheses to be omitted when there are multiple exception types and the as clause is not used. For example the following expressions are now valid:

try:
    release_new_sleep_token_album()
except AlbumNotFound, SongsTooGoodToBeReleased:
    print("Sorry, no new album this year.")

 # The same applies to except* (for exception groups):
try:
    release_new_sleep_token_album()
except* AlbumNotFound, SongsTooGoodToBeReleased:
    print("Sorry, no new album this year.")

Check PEP 758 for more details.

(Contributed by Pablo Galindo and Brett Cannon in gh-131831.)

Ver também

PEP 758.

PEP 649 and 749: deferred evaluation of annotations

The annotations on functions, classes, and modules are no longer evaluated eagerly. Instead, annotations are stored in special-purpose annotate functions and evaluated only when necessary (except if from __future__ import annotations is used). This is specified in PEP 649 and PEP 749.

This change is designed to make annotations in Python more performant and more usable in most circumstances. The runtime cost for defining annotations is minimized, but it remains possible to introspect annotations at runtime. It is no longer necessary to enclose annotations in strings if they contain forward references.

The new annotationlib module provides tools for inspecting deferred annotations. Annotations may be evaluated in the VALUE format (which evaluates annotations to runtime values, similar to the behavior in earlier Python versions), the FORWARDREF format (which replaces undefined names with special markers), and the STRING format (which returns annotations as strings).

This example shows how these formats behave:

>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
...     pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
  ...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}

Implications for annotated code

If you define annotations in your code (for example, for use with a static type checker), then this change probably does not affect you: you can keep writing annotations the same way you did with previous versions of Python.

You will likely be able to remove quoted strings in annotations, which are frequently used for forward references. Similarly, if you use from __future__ import annotations to avoid having to write strings in annotations, you may well be able to remove that import once you support only Python 3.14 and newer. However, if you rely on third-party libraries that read annotations, those libraries may need changes to support unquoted annotations before they work as expected.

Implications for readers of __annotations__

If your code reads the __annotations__ attribute on objects, you may want to make changes in order to support code that relies on deferred evaluation of annotations. For example, you may want to use annotationlib.get_annotations() with the FORWARDREF format, as the dataclasses module now does.

The external typing_extensions package provides partial backports of some of the functionality of the annotationlib module, such as the Format enum and the get_annotations() function. These can be used to write cross-version code that takes advantage of the new behavior in Python 3.14.

from __future__ import annotations

In Python 3.7, PEP 563 introduced the from __future__ import annotations directive, which turns all annotations into strings. This directive is now considered deprecated and it is expected to be removed in a future version of Python. However, this removal will not happen until after Python 3.13, the last version of Python without deferred evaluation of annotations, reaches its end of life in 2029. In Python 3.14, the behavior of code using from __future__ import annotations is unchanged.

(Contributed by Jelle Zijlstra in gh-119180; PEP 649 was written by Larry Hastings.)

Ver também

PEP 649 and PEP 749.

Mensagens de erro melhoradas

  • The interpreter now provides helpful suggestions when it detects typos in Python keywords. When a word that closely resembles a Python keyword is encountered, the interpreter will suggest the correct keyword in the error message. This feature helps programmers quickly identify and fix common typing mistakes. For example:

    >>> whille True:
    ...     pass
    Traceback (most recent call last):
      File "<stdin>", line 1
        whille True:
        ^^^^^^
    SyntaxError: invalid syntax. Did you mean 'while'?
    
    >>> asynch def fetch_data():
    ...     pass
    Traceback (most recent call last):
      File "<stdin>", line 1
        asynch def fetch_data():
        ^^^^^^
    SyntaxError: invalid syntax. Did you mean 'async'?
    
    >>> async def foo():
    ...     awaid fetch_data()
    Traceback (most recent call last):
      File "<stdin>", line 2
        awaid fetch_data()
        ^^^^^
    SyntaxError: invalid syntax. Did you mean 'await'?
    
    >>> raisee ValueError("Error")
    Traceback (most recent call last):
      File "<stdin>", line 1
        raisee ValueError("Error")
        ^^^^^^
    SyntaxError: invalid syntax. Did you mean 'raise'?
    

    While the feature focuses on the most common cases, some variations of misspellings may still result in regular syntax errors. (Contributed by Pablo Galindo in gh-132449.)

  • When unpacking assignment fails due to incorrect number of variables, the error message prints the received number of values in more cases than before. (Contributed by Tushar Sadhwani in gh-122239.)

    >>> x, y, z = 1, 2, 3, 4
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
        x, y, z = 1, 2, 3, 4
        ^^^^^^^
    ValueError: too many values to unpack (expected 3, got 4)
    
  • elif statements that follow an else block now have a specific error message. (Contributed by Steele Farnsworth in gh-129902.)

    >>> if who == "me":
    ...     print("It's me!")
    ... else:
    ...     print("It's not me!")
    ... elif who is None:
    ...     print("Who is it?")
    File "<stdin>", line 5
      elif who is None:
      ^^^^
    SyntaxError: 'elif' block follows an 'else' block
    
  • If a statement (pass, del, return, yield, raise, break, continue, assert, import, from) is passed to the Expressões condicionais after else, or one of pass, break, or continue is passed before if, then the error message highlights where the expression is required. (Contributed by Sergey Miryanov in gh-129515.)

    >>> x = 1 if True else pass
    Traceback (most recent call last):
      File "<string>", line 1
        x = 1 if True else pass
                           ^^^^
    SyntaxError: expected expression after 'else', but statement is given
    
    >>> x = continue if True else break
    Traceback (most recent call last):
      File "<string>", line 1
        x = continue if True else break
            ^^^^^^^^
    SyntaxError: expected expression before 'if', but statement is given
    
  • When incorrectly closed strings are detected, the error message suggests that the string may be intended to be part of the string. (Contributed by Pablo Galindo in gh-88535.)

    >>> "The interesting object "The important object" is very important"
    Traceback (most recent call last):
    SyntaxError: invalid syntax. Is this intended to be part of the string?
    
  • When strings have incompatible prefixes, the error now shows which prefixes are incompatible. (Contributed by Nikita Sobolev in gh-133197.)

    >>> ub'abc'
      File "<python-input-0>", line 1
        ub'abc'
        ^^
    SyntaxError: 'u' and 'b' prefixes are incompatible
    
  • Improved error messages when using as with incompatible targets in:

    • Imports: import ... as ...

    • From imports: from ... import ... as ...

    • Except handlers: except ... as ...

    • Pattern-match cases: case ... as ...

    (Contributed by Nikita Sobolev in gh-123539, gh-123562, and gh-123440.)

    >>> import ast as arr[0]
      File "<python-input-1>", line 1
        import ast as arr[0]
                      ^^^^^^
    SyntaxError: cannot use subscript as import target
    
  • Improved error message when trying to add an instance of an unhashable type to a dict or set. (Contributed by CF Bolz-Tereick and Victor Stinner in gh-132828.)

    >>> s = set()
    >>> s.add({'pages': 12, 'grade': 'A'})
    Traceback (most recent call last):
      File "<python-input-1>", line 1, in <module>
        s.add({'pages': 12, 'grade': 'A'})
        ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: cannot use 'dict' as a set element (unhashable type: 'dict')
    >>> d = {}
    >>> l = [1, 2, 3]
    >>> d[l] = 12
    Traceback (most recent call last):
      File "<python-input-4>", line 1, in <module>
        d[l] = 12
        ~^^^
    TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
    

PEP 741: Python Configuration C API

Add a PyInitConfig C API to configure the Python initialization without relying on C structures and the ability to make ABI-compatible changes in the future.

Complete the PEP 587 PyConfig C API by adding PyInitConfig_AddModule() which can be used to add a built-in extension module; feature previously referred to as the “inittab”.

Add PyConfig_Get() and PyConfig_Set() functions to get and set the current runtime configuration.

PEP 587 “Python Initialization Configuration” unified all the ways to configure the Python initialization. This PEP unifies also the configuration of the Python preinitialization and the Python initialization in a single API. Moreover, this PEP only provides a single choice to embed Python, instead of having two “Python” and “Isolated” choices (PEP 587), to simplify the API further.

The lower level PEP 587 PyConfig API remains available for use cases with an intentionally higher level of coupling to CPython implementation details (such as emulating the full functionality of CPython’s CLI, including its configuration mechanisms).

(Contributed by Victor Stinner in gh-107954.)

Ver também

PEP 741.

Asyncio introspection capabilities

Added a new command-line interface to inspect running Python processes using asynchronous tasks, available via:

python -m asyncio ps PID

This tool inspects the given process ID (PID) and displays information about currently running asyncio tasks. It outputs a task table: a flat listing of all tasks, their names, their coroutine stacks, and which tasks are awaiting them.

python -m asyncio pstree PID

This tool fetches the same information, but renders a visual async call tree, showing coroutine relationships in a hierarchical format. This command is particularly useful for debugging long-running or stuck asynchronous programs. It can help developers quickly identify where a program is blocked, what tasks are pending, and how coroutines are chained together.

For example given this code:

import asyncio

async def play(track):
    await asyncio.sleep(5)
    print(f"🎵 Finished: {track}")

async def album(name, tracks):
    async with asyncio.TaskGroup() as tg:
        for track in tracks:
            tg.create_task(play(track), name=track)

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(
          album("Sundowning", ["TNDNBTG", "Levitate"]), name="Sundowning")
        tg.create_task(
          album("TMBTE", ["DYWTYLM", "Aqua Regia"]), name="TMBTE")

if __name__ == "__main__":
    asyncio.run(main())

Executing the new tool on the running process will yield a table like this:

python -m asyncio ps 12345

tid        task id              task name            coroutine chain                                    awaiter name         awaiter id
---------------------------------------------------------------------------------------------------------------------------------------
8138752    0x564bd3d0210        Task-1                                                                                       0x0
8138752    0x564bd3d0410        Sundowning           _aexit -> __aexit__ -> main                        Task-1               0x564bd3d0210
8138752    0x564bd3d0610        TMBTE                _aexit -> __aexit__ -> main                        Task-1               0x564bd3d0210
8138752    0x564bd3d0810        TNDNBTG              _aexit -> __aexit__ -> album                       Sundowning           0x564bd3d0410
8138752    0x564bd3d0a10        Levitate             _aexit -> __aexit__ -> album                       Sundowning           0x564bd3d0410
8138752    0x564bd3e0550        DYWTYLM              _aexit -> __aexit__ -> album                       TMBTE                 0x564bd3d0610
8138752    0x564bd3e0710        Aqua Regia           _aexit -> __aexit__ -> album                       TMBTE                 0x564bd3d0610

or:

python -m asyncio pstree 12345

└── (T) Task-1
    └──  main
        └──  __aexit__
            └──  _aexit
                ├── (T) Sundowning
                   └──  album
                       └──  __aexit__
                           └──  _aexit
                               ├── (T) TNDNBTG
                               └── (T) Levitate
                └── (T) TMBTE
                    └──  album
                        └──  __aexit__
                            └──  _aexit
                                ├── (T) DYWTYLM
                                └── (T) Aqua Regia

If a cycle is detected in the async await graph (which could indicate a programming issue), the tool raises an error and lists the cycle paths that prevent tree construction.

(Contributed by Pablo Galindo, Łukasz Langa, Yury Selivanov, and Marta Gomez Macias in gh-91048.)

A new type of interpreter

A new type of interpreter has been added to CPython. It uses tail calls between small C functions that implement individual Python opcodes, rather than one large C case statement. For certain newer compilers, this interpreter provides significantly better performance. Preliminary numbers on our machines suggest anywhere up to 30% faster Python code, and a geometric mean of 3-5% faster on pyperformance depending on platform and architecture. The baseline is Python 3.14 built with Clang 19 without this new interpreter.

This interpreter currently only works with Clang 19 and newer on x86-64 and AArch64 architectures. However, we expect that a future release of GCC will support this as well.

This feature is opt-in for now. We highly recommend enabling profile-guided optimization with the new interpreter as it is the only configuration we have tested and can validate its improved performance. For further information on how to build Python, see --with-tail-call-interp.

Nota

This is not to be confused with tail call optimization of Python functions, which is currently not implemented in CPython.

This new interpreter type is an internal implementation detail of the CPython interpreter. It doesn’t change the visible behavior of Python programs at all. It can improve their performance, but doesn’t change anything else.

Atenção

This section previously reported a 9-15% geometric mean speedup. This number has since been cautiously revised down to 3-5%. While we expect performance results to be better than what we report, our estimates are more conservative due to a compiler bug found in Clang/LLVM 19, which causes the normal interpreter to be slower. We were unaware of this bug, resulting in inaccurate results. We sincerely apologize for communicating results that were only accurate for LLVM v19.1.x and v20.1.0. In the meantime, the bug has been fixed in LLVM v20.1.1 and for the upcoming v21.1, but it will remain unfixed for LLVM v19.1.x and v20.1.0. Thus any benchmarks with those versions of LLVM may produce inaccurate numbers. (Thanks to Nelson Elhage for bringing this to light.)

(Contributed by Ken Jin in gh-128563, with ideas on how to implement this in CPython by Mark Shannon, Garrett Gu, Haoran Xu, and Josh Haberman.)

Free-threaded mode

Free-threaded mode (PEP 703), initially added in 3.13, has been significantly improved. The implementation described in PEP 703 was finished, including C API changes, and temporary workarounds in the interpreter were replaced with more permanent solutions. The specializing adaptive interpreter (PEP 659) is now enabled in free-threaded mode, which along with many other optimizations greatly improves its performance. The performance penalty on single-threaded code in free-threaded mode is now roughly 5-10%, depending on platform and C compiler used.

This work was done by many contributors: Sam Gross, Matt Page, Neil Schemenauer, Thomas Wouters, Donghee Na, Kirill Podoprigora, Ken Jin, Itamar Oren, Brett Simmers, Dino Viehland, Nathan Goldbaum, Ralf Gommers, Lysandros Nikolaou, Kumar Aditya, Edgar Margffoy, and many others.

Some of these contributors are employed by Meta, which has continued to provide significant engineering resources to support this project.

From 3.14, when compiling extension modules for the free-threaded build of CPython on Windows, the preprocessor variable Py_GIL_DISABLED now needs to be specified by the build backend, as it will no longer be determined automatically by the C compiler. For a running interpreter, the setting that was used at compile time can be found using sysconfig.get_config_var().

Syntax highlighting in PyREPL

The default interactive shell now highlights Python syntax as you type. The feature is enabled by default unless the PYTHON_BASIC_REPL environment is set or any color-disabling environment variables are used. See Controlando cores for details.

The default color theme for syntax highlighting strives for good contrast and uses exclusively the 4-bit VGA standard ANSI color codes for maximum compatibility. The theme can be customized using an experimental API _colorize.set_theme(). This can be called interactively, as well as in the PYTHONSTARTUP script.

(Contributed by Łukasz Langa in gh-131507.)

Binary releases for the experimental just-in-time compiler

The official macOS and Windows release binaries now include an experimental just-in-time (JIT) compiler. Although it is not recommended for production use, it can be tested by setting PYTHON_JIT=1 as an environment variable. Downstream source builds and redistributors can use the --enable-experimental-jit=yes-off configuration option for similar behavior.

The JIT is at an early stage and still in active development. As such, the typical performance impact of enabling it can range from 10% slower to 20% faster, depending on workload. To aid in testing and evaluation, a set of introspection functions has been provided in the sys._jit namespace. sys._jit.is_available() can be used to determine if the current executable supports JIT compilation, while sys._jit.is_enabled() can be used to tell if JIT compilation has been enabled for the current process.

Currently, the most significant missing functionality is that native debuggers and profilers like gdb and perf are unable to unwind through JIT frames (Python debuggers and profilers, like pdb or profile, continue to work without modification). Free-threaded builds do not support JIT compilation.

Please report any bugs or major performance regressions that you encounter!

Ver também

PEP 744

Other language changes

  • The default interactive shell now supports import autocompletion. This means that typing import foo and pressing <tab> will suggest modules starting with foo. Similarly, typing from foo import b will suggest submodules of foo starting with b. Note that autocompletion of module attributes is not currently supported. (Contributed by Tomas Roun in gh-69605.)

  • The map() built-in now has an optional keyword-only strict flag like zip() to check that all the iterables are of equal length. (Contributed by Wannes Boeykens in gh-119793.)

  • Incorrect usage of await and asynchronous comprehensions is now detected even if the code is optimized away by the -O command-line option. For example, python -O -c 'assert await 1' now produces a SyntaxError. (Contributed by Jelle Zijlstra in gh-121637.)

  • Writes to __debug__ are now detected even if the code is optimized away by the -O command-line option. For example, python -O -c 'assert (__debug__ := 1)' now produces a SyntaxError. (Contributed by Irit Katriel in gh-122245.)

  • Add class methods float.from_number() and complex.from_number() to convert a number to float or complex type correspondingly. They raise an error if the argument is a string. (Contributed by Serhiy Storchaka in gh-84978.)

  • Implement mixed-mode arithmetic rules combining real and complex numbers as specified by C standards since C99. (Contributed by Sergey B Kirpichev in gh-69639.)

  • All Windows code pages are now supported as “cpXXX” codecs on Windows. (Contributed by Serhiy Storchaka in gh-123803.)

  • super objects are now pickleable and copyable. (Contributed by Serhiy Storchaka in gh-125767.)

  • The memoryview type now supports subscription, making it a generic type. (Contributed by Brian Schubert in gh-126012.)

  • Support underscore and comma as thousands separators in the fractional part for floating-point presentation types of the new-style string formatting (with format() or Literais de strings formatadas). (Contributed by Sergey B Kirpichev in gh-87790.)

  • The bytes.fromhex() and bytearray.fromhex() methods now accept ASCII bytes and bytes-like objects. (Contributed by Daniel Pope in gh-129349.)

  • Support \z as a synonym for \Z in regular expressions. It is interpreted unambiguously in many other regular expression engines, unlike \Z, which has subtly different behavior. (Contributed by Serhiy Storchaka in gh-133306.)

  • \B in regular expression now matches empty input string. Now it is always the opposite of \b. (Contributed by Serhiy Storchaka in gh-124130.)

  • iOS and macOS apps can now be configured to redirect stdout and stderr content to the system log. (Contributed by Russell Keith-Magee in gh-127592.)

  • The iOS testbed is now able to stream test output while the test is running. The testbed can also be used to run the test suite of projects other than CPython itself. (Contributed by Russell Keith-Magee in gh-127592.)

  • Three-argument pow() now tries calling __rpow__() if necessary. Previously it was only called in two-argument pow() and the binary power operator. (Contributed by Serhiy Storchaka in gh-130104.)

  • Add a built-in implementation for HMAC (RFC 2104) using formally verified code from the HACL* project. This implementation is used as a fallback when the OpenSSL implementation of HMAC is not available. (Contributed by Bénédikt Tran in gh-99108.)

  • The import time flag can now track modules that are already loaded (‘cached’), via the new -X importtime=2. When such a module is imported, the self and cumulative times are replaced by the string cached. Values above 2 for -X importtime are now reserved for future use. (Contributed by Noah Kim and Adam Turner in gh-118655.)

  • When subclassing from a pure C type, the C slots for the new type are no longer replaced with a wrapped version on class creation if they are not explicitly overridden in the subclass. (Contributed by Tomasz Pytel in gh-132329.)

  • The command-line option -c now automatically dedents its code argument before execution. The auto-dedentation behavior mirrors textwrap.dedent(). (Contributed by Jon Crall and Steven Sun in gh-103998.)

  • Improve error message when an object supporting the synchronous context manager protocol is entered using async with instead of with. And vice versa with the asynchronous context manager protocol. (Contributed by Bénédikt Tran in gh-128398.)

  • -J is no longer a reserved flag for Jython, and now has no special meaning. (Contributed by Adam Turner in gh-133336.)

PEP 765: Disallow return/break/continue that exit a finally block

The compiler emits a SyntaxWarning when a return, break or continue statements appears where it exits a finally block. This change is specified in PEP 765.

Novos módulos

Improved modules

argparse

  • The default value of the program name for argparse.ArgumentParser now reflects the way the Python interpreter was instructed to find the __main__ module code. (Contributed by Serhiy Storchaka and Alyssa Coghlan in gh-66436.)

  • Introduced the optional suggest_on_error parameter to argparse.ArgumentParser, enabling suggestions for argument choices and subparser names if mistyped by the user. (Contributed by Savannah Ostrowski in gh-124456.)

  • Introduced the optional color parameter to argparse.ArgumentParser, enabling color for help text. This can be controlled by environment variables. Color has also been enabled for help in the stdlib CLIs which use argparse. (Contributed by Hugo van Kemenade in gh-130645.)

ast

  • Add ast.compare() for comparing two ASTs. (Contributed by Batuhan Taskaya and Jeremy Hylton in gh-60191.)

  • Add support for copy.replace() for AST nodes. (Contributed by Bénédikt Tran in gh-121141.)

  • Docstrings are now removed from an optimized AST in optimization level 2. (Contributed by Irit Katriel in gh-123958.)

  • The repr() output for AST nodes now includes more information. (Contributed by Tomas Roun in gh-116022.)

  • ast.parse(), when called with an AST as input, now always verifies that the root node type is appropriate. (Contributed by Irit Katriel in gh-130139.)

  • Add new --feature-version, --optimize, --show-empty options to command-line interface. (Contributed by Semyon Moroz in gh-133367.)

asyncio

  • The function and methods named create_task() now take an arbitrary list of keyword arguments. All keyword arguments are passed to the Task constructor or the custom task factory. (See set_task_factory() for details.) The name and context keyword arguments are no longer special; the name should now be set using the name keyword argument of the factory, and context may be None.

    This affects the following function and methods: asyncio.create_task(), asyncio.loop.create_task(), asyncio.TaskGroup.create_task(). (Contributed by Thomas Grainger in gh-128307.)

bdb

calendar

concurrent.futures

  • Add InterpreterPoolExecutor, which exposes “subinterpreters” (multiple Python interpreters in the same process) to Python code. This is separate from the proposed API in PEP 734. (Contributed by Eric Snow in gh-124548.)

contextvars

ctypes

curses

datetime

decimal

difflib

  • Comparison pages with highlighted changes generated by the difflib.HtmlDiff class now support dark mode. (Contributed by Jiahao Li in gh-129939.)

dis

errno

faulthandler

fnmatch

fractions

functools

getopt

  • Add support for options with optional arguments. (Contributed by Serhiy Storchaka in gh-126374.)

  • Add support for returning intermixed options and non-option arguments in order. (Contributed by Serhiy Storchaka in gh-126390.)

getpass

  • Support keyboard feedback by getpass.getpass() via the keyword-only optional argument echo_char. Placeholder characters are rendered whenever a character is entered, and removed when a character is deleted. (Contributed by Semyon Moroz in gh-77065.)

graphlib

heapq

hmac

  • Add a built-in implementation for HMAC (RFC 2104) using formally verified code from the HACL* project. (Contributed by Bénédikt Tran in gh-99108.)

http

  • Directory lists and error pages generated by the http.server module allow the browser to apply its default dark mode. (Contributed by Yorik Hansen in gh-123430.)

  • The http.server module now supports serving over HTTPS using the http.server.HTTPSServer class. This functionality is exposed by the command-line interface (python -m http.server) through the following options:

    • --tls-cert <path>: Path to the TLS certificate file.

    • --tls-key <path>: Optional path to the private key file.

    • --tls-password-file <path>: Optional path to the password file for the private key.

    (Contributed by Semyon Moroz in gh-85162.)

imaplib

inspect

io

json

linecache

logging.handlers

math

  • Added more detailed error messages for domain errors in the module. (Contributed by by Charlie Zhao and Sergey B Kirpichev in gh-101410.)

mimetypes

  • Document the command-line for mimetypes. It now exits with 1 on failure instead of 0 and 2 on incorrect command-line parameters instead of 1. Also, errors are printed to stderr instead of stdout and their text is made tighter. (Contributed by Oleg Iarygin and Hugo van Kemenade in gh-93096.)

  • Add MS and RFC 8081 MIME types for fonts:

    • Embedded OpenType: application/vnd.ms-fontobject

    • OpenType Layout (OTF) font/otf

    • TrueType: font/ttf

    • WOFF 1.0 font/woff

    • WOFF 2.0 font/woff2

    (Contributed by Sahil Prajapati and Hugo van Kemenade in gh-84852.)

  • Add RFC 9559 MIME types for Matroska audiovisual data container structures, containing:

    • audio with no video: audio/matroska (.mka)

    • video: video/matroska (.mkv)

    • stereoscopic video: video/matroska-3d (.mk3d)

    (Contributed by Hugo van Kemenade in gh-89416.)

  • Add MIME types for images with RFCs:

    • RFC 1494: CCITT Group 3 (.g3)

    • RFC 3362: Real-time Facsimile, T.38 (.t38)

    • RFC 3745: JPEG 2000 (.jp2), extension (.jpx) and compound (.jpm)

    • RFC 3950: Tag Image File Format Fax eXtended, TIFF-FX (.tfx)

    • RFC 4047: Flexible Image Transport System (.fits)

    • RFC 7903: Enhanced Metafile (.emf) and Windows Metafile (.wmf)

    (Contributed by Hugo van Kemenade in gh-85957.)

  • More MIME type changes:

    • RFC 2361: Change type for .avi to video/vnd.avi and for .wav to audio/vnd.wave

    • RFC 4337: Add MPEG-4 audio/mp4 (.m4a)

    • RFC 5334: Add Ogg media (.oga, .ogg and .ogx)

    • RFC 6713: Add gzip application/gzip (.gz)

    • RFC 9639: Add FLAC audio/flac (.flac)

    • Add 7z application/x-7z-compressed (.7z)

    • Add Android Package application/vnd.android.package-archive (.apk) when not strict

    • Add deb application/x-debian-package (.deb)

    • Add glTF binary model/gltf-binary (.glb)

    • Add glTF JSON/ASCII model/gltf+json (.gltf)

    • Add M4V video/x-m4v (.m4v)

    • Add PHP application/x-httpd-php (.php)

    • Add RAR application/vnd.rar (.rar)

    • Add RPM application/x-rpm (.rpm)

    • Add STL model/stl (.stl)

    • Add Windows Media Video video/x-ms-wmv (.wmv)

    • De facto: Add WebM audio/webm (.weba)

    • ECMA-376: Add .docx, .pptx and .xlsx types

    • OASIS: Add OpenDocument .odg, .odp, .ods and .odt types

    • W3C: Add EPUB application/epub+zip (.epub)

    (Contributed by Hugo van Kemenade in gh-129965.)

  • Add RFC 9512 application/yaml MIME type for YAML files (.yaml and .yml). (Contributed by Sasha “Nelie” Chernykh and Hugo van Kemenade in gh-132056.)

multiprocessing

operador

  • Two new functions operator.is_none() and operator.is_not_none() have been added, such that operator.is_none(obj) is equivalent to obj is None and operator.is_not_none(obj) is equivalent to obj is not None. (Contributed by Raymond Hettinger and Nico Mexis in gh-115808.)

os

pathlib

  • Add methods to pathlib.Path to recursively copy or move files and directories:

    • copy() copies a file or directory tree to a destination.

    • copy_into() copies into a destination directory.

    • move() moves a file or directory tree to a destination.

    • move_into() moves into a destination directory.

    (Contributed by Barney Gale in gh-73991.)

  • Add pathlib.Path.info attribute, which stores an object implementing the pathlib.types.PathInfo protocol (also new). The object supports querying the file type and internally caching stat() results. Path objects generated by iterdir() are initialized with file type information gleaned from scanning the parent directory. (Contributed by Barney Gale in gh-125413.)

pdb

  • Hardcoded breakpoints (breakpoint() and pdb.set_trace()) now reuse the most recent Pdb instance that calls set_trace(), instead of creating a new one each time. As a result, all the instance specific data like display and commands are preserved across hardcoded breakpoints. (Contributed by Tian Gao in gh-121450.)

  • Add a new argument mode to pdb.Pdb. Disable the restart command when pdb is in inline mode. (Contributed by Tian Gao in gh-123757.)

  • A confirmation prompt will be shown when the user tries to quit pdb in inline mode. y, Y, <Enter> or EOF will confirm the quit and call sys.exit(), instead of raising bdb.BdbQuit. (Contributed by Tian Gao in gh-124704.)

  • Inline breakpoints like breakpoint() or pdb.set_trace() will always stop the program at calling frame, ignoring the skip pattern (if any). (Contributed by Tian Gao in gh-130493.)

  • <tab> at the beginning of the line in pdb multi-line input will fill in a 4-space indentation now, instead of inserting a \t character. (Contributed by Tian Gao in gh-130471.)

  • Auto-indent is introduced in pdb multi-line input. It will either keep the indentation of the last line or insert a 4-space indentation when it detects a new code block. (Contributed by Tian Gao in gh-133350.)

  • $_asynctask is added to access the current asyncio task if applicable. (Contributed by Tian Gao in gh-124367.)

  • pdb now supports two backends: sys.settrace() and sys.monitoring. Using pdb CLI or breakpoint() will always use the sys.monitoring backend. Explicitly instantiating pdb.Pdb and its derived classes will use the sys.settrace() backend by default, which is configurable. (Contributed by Tian Gao in gh-124533.)

  • pdb.set_trace_async() is added to support debugging asyncio coroutines. await statements are supported with this function. (Contributed by Tian Gao in gh-132576.)

  • Source code displayed in pdb will be syntax-highlighted. This feature can be controlled using the same methods as PyREPL, in addition to the newly added colorize argument of pdb.Pdb. (Contributed by Tian Gao and Łukasz Langa in gh-133355.)

pickle

  • Set the default protocol version on the pickle module to 5. For more details, see pickle protocols.

  • Add notes for pickle serialization errors that allow to identify the source of the error. (Contributed by Serhiy Storchaka in gh-122213.)

platform

pydoc

  • Annotations in help output are now usually displayed in a format closer to that in the original source. (Contributed by Jelle Zijlstra in gh-101552.)

socket

  • Improve and fix support for Bluetooth sockets.

    • Fix support of Bluetooth sockets on NetBSD and DragonFly BSD. (Contributed by Serhiy Storchaka in gh-132429.)

    • Fix support for BTPROTO_HCI on FreeBSD. (Contributed by Victor Stinner in gh-111178.)

    • Add support for BTPROTO_SCO on FreeBSD. (Contributed by Serhiy Storchaka in gh-85302.)

    • Add support for cid and bdaddr_type in the address for BTPROTO_L2CAP on FreeBSD. (Contributed by Serhiy Storchaka in gh-132429.)

    • Add support for channel in the address for BTPROTO_HCI on Linux. (Contributed by Serhiy Storchaka in gh-70145.)

    • Accept an integer as the address for BTPROTO_HCI on Linux. (Contributed by Serhiy Storchaka in gh-132099.)

    • Return cid in getsockname() for BTPROTO_L2CAP. (Contributed by Serhiy Storchaka in gh-132429.)

    • Add many new constants. (Contributed by Serhiy Storchaka in gh-132734.)

ssl

  • Indicate through ssl.HAS_PHA whether the ssl module supports TLSv1.3 post-handshake client authentication (PHA). (Contributed by Will Childs-Klein in gh-128036.)

struct

  • Support the float complex and double complex C types in the struct module (formatting characters 'F' and 'D' respectively). (Contributed by Sergey B Kirpichev in gh-121249.)

symtable

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.

  • Add sys._is_immortal() for determining if an object is immortal. (Contributed by Peter Bierma in gh-128509.)

  • On FreeBSD, sys.platform doesn’t contain the major version anymore. It is always 'freebsd', instead of 'freebsd13' or 'freebsd14'.

  • Raise DeprecationWarning for sys._clear_type_cache(). This function was deprecated in Python 3.13 but it didn’t raise a runtime warning.

sys.monitoring

sysconfig

threading

tkinter

  • Make tkinter widget methods after() and after_idle() accept arguments passed by keyword. (Contributed by Zhikang Yan in gh-126899.)

  • Add ability to specify name for tkinter.OptionMenu and tkinter.ttk.OptionMenu. (Contributed by Zhikang Yan in gh-130482.)

turtle

tipos

typing

  • types.UnionType and typing.Union are now aliases for each other, meaning that both old-style unions (created with Union[int, str]) and new-style unions (int | str) now create instances of the same runtime type. This unifies the behavior between the two syntaxes, but leads to some differences in behavior that may affect users who introspect types at runtime:

    • Both syntaxes for creating a union now produce the same string representation in repr(). For example, repr(Union[int, str]) is now "int | str" instead of "typing.Union[int, str]".

    • Unions created using the old syntax are no longer cached. Previously, running Union[int, str] multiple times would return the same object (Union[int, str] is Union[int, str] would be True), but now it will return two different objects. Users should use == to compare unions for equality, not is. New-style unions have never been cached this way. This change could increase memory usage for some programs that use a large number of unions created by subscripting typing.Union. However, several factors offset this cost: unions used in annotations are no longer evaluated by default in Python 3.14 because of PEP 649; an instance of types.UnionType is itself much smaller than the object returned by Union[] was on prior Python versions; and removing the cache also saves some space. It is therefore unlikely that this change will cause a significant increase in memory usage for most users.

    • Previously, old-style unions were implemented using the private class typing._UnionGenericAlias. This class is no longer needed for the implementation, but it has been retained for backward compatibility, with removal scheduled for Python 3.17. Users should use documented introspection helpers like typing.get_origin() and typing.get_args() instead of relying on private implementation details.

    • It is now possible to use typing.Union itself in isinstance() checks. For example, isinstance(int | str, typing.Union) will return True; previously this raised TypeError.

    • The __args__ attribute of typing.Union objects is no longer writable.

    • It is no longer possible to set any attributes on typing.Union objects. This only ever worked for dunder attributes on previous versions, was never documented to work, and was subtly broken in many cases.

    (Contributed by Jelle Zijlstra in gh-105499.)

unicodedata

  • The Unicode database has been updated to Unicode 16.0.0.

unittest

urllib

  • Upgrade HTTP digest authentication algorithm for urllib.request by supporting SHA-256 digest authentication as specified in RFC 7616. (Contributed by Calvin Bui in gh-128193.)

  • Improve ergonomics and standards compliance when parsing and emitting file: URLs.

    In urllib.request.url2pathname():

    • Accept a complete URL when the new require_scheme argument is set to true.

    • Discard URL authority if it matches the local hostname.

    • Discard URL authority if it resolves to a local IP address when the new resolve_host argument is set to true.

    • Raise URLError if a URL authority isn’t local, except on Windows where we return a UNC path as before.

    In urllib.request.pathname2url():

    • Return a complete URL when the new add_scheme argument is set to true.

    • Include an empty URL authority when a path begins with a slash. For example, the path /etc/hosts is converted to the URL ///etc/hosts.

    On Windows, drive letters are no longer converted to uppercase, and : characters not following a drive letter no longer cause an OSError exception to be raised.

    (Contributed by Barney Gale in gh-125866.)

uuid

webbrowser

  • Names in the BROWSER environment variable can now refer to already registered browsers for the webbrowser module, instead of always generating a new browser command.

    Isso torna possível definir BROWSER como o valor de um dos navegadores suportados no macOS.

zipinfo

Otimizações

asyncio

  • asyncio has a new per-thread double linked list implementation internally for native tasks which speeds up execution by 10-20% on standard pyperformance benchmarks and reduces memory usage. This enables external introspection tools such as python -m asyncio pstree to introspect the call graph of asyncio tasks running in all threads. (Contributed by Kumar Aditya in gh-107803.)

  • asyncio has first class support for free-threading builds. This enables parallel execution of multiple event loops across different threads and scales linearly with the number of threads. (Contributed by Kumar Aditya in gh-128002.)

  • asyncio has new utility functions for introspecting and printing the program’s call graph: asyncio.capture_call_graph() and asyncio.print_call_graph(). (Contributed by Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa in gh-91048.)

base64

  • Improve the performance of base64.b16decode() by up to ten times, and reduce the import time of base64 by up to six times. (Contributed by Bénédikt Tran, Chris Markiewicz, and Adam Turner in gh-118761.)

io

  • io which provides the built-in open() makes less system calls when opening regular files as well as reading whole files. Reading a small operating system cached file in full is up to 15% faster. pathlib.Path.read_bytes() has the most optimizations for reading a file’s bytes in full. (Contributed by Cody Maloney and Victor Stinner in gh-120754 and gh-90102.)

uuid

  • Improve generation of UUID objects via their dedicated functions:

    • uuid3() and uuid5() are both roughly 40% faster for 16-byte names and 20% faster for 1024-byte names. Performance for longer names remains unchanged.

    • uuid4() and uuid8() are 30% and 40% faster respectively.

    (Contributed by Bénédikt Tran in gh-128150.)

zlib

  • On Windows, zlib-ng is now used as the implementation of the zlib module. This should produce compatible and comparable results with better performance, though it is worth noting that zlib.Z_BEST_SPEED (1) may result in significantly less compression than the previous implementation (while also significantly reducing the time taken to compress). (Contributed by Steve Dower in gh-91349.)

Descontinuados

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__.cached 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:

    • The obsolete and rarely used CGIHTTPRequestHandler has been deprecated since Python 3.13. No direct replacement exists. Anything is better than CGI to interface a web server with a request handler.

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

  • importlib:

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

  • locale:

  • pathlib:

  • platform:

    • platform.java_ver() has been deprecated since Python 3.13. This function is only useful for Jython support, has a confusing API, and is largely untested.

  • sysconfig:

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

    • Ao usar a sintaxe funcional de TypedDicts, não passar um valor para o parâmetro fields (TD = TypedDict("TD")) ou passar None (TD = TypedDict("TD", None)) foi está descontinuado desde o Python 3.13. Use class TD(TypedDict): pass ou TD = TypedDict("TD", {}) para criar uma classe TypedDict com nenhum campo.

    • 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:

    • The getmark(), setmark() and getmarkers() methods of the Wave_read and Wave_write classes have been deprecated since Python 3.13.

  • zipimport:

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

  • functools:

    • A chamada da implementação Python de functools.reduce() com function ou sequence como argumentos nomeados foi descontinuada desde o Python 3.14.

  • logging:

    O suporte para manipuladores de registro personalizados com o argumento strm foi descontinuado e está programado para ser removido no Python 3.16. Em vez disso, defina manipuladores com o argumento stream. (Contribuição de Mariusz Felisiak em gh-115032.)

  • mimetypes:

    • Extensões válidas começam com um ‘.’ ou estão vazias para mimetypes.MimeTypes.add_type(). Extensões sem ponto estão descontinuadas e levantarão uma exceção ValueError no Python 3.16. (Contribuição de Hugo van Kemenade em gh-75223.)

  • 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:

  • sysconfig:

    • A função sysconfig.expand_makefile_vars() está descontinuada desde o Python 3.14. Em vez disso, use o argumento vars de sysconfig.get_paths().

  • tarfile:

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

Remoção pendente no Python 3.17

  • typing:

    • Antes do Python 3.14, as uniões antigas eram implementadas usando a classe privada typing._UnionGenericAlias. Essa classe não é mais necessária para a implementação, mas foi mantida para compatibilidade com versões anteriores, com remoção prevista para o Python 3.17. Os usuários devem usar auxiliares de introspecção documentados, como typing.get_origin() e typing.get_args(), em vez de depender de detalhes de implementação privada.

Remoção pendente no Python 3.19

  • ctypes:

    • Troca implícita para o layout de estrutura compatível com MSVC definindo _pack_, mas não _layout_ em plataformas não Windows.

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

    • A passagem do argumento nomeado não documentado prefix_chars para add_argument_group() agora está descontinuado.

    • O conversor de tipo argparse.FileType está descontinuado.

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

  • codecs: use open() em vez de codecs.open(). (gh-133038)

  • 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:

    • 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; em vez disso, use BytesIO e o modo binário.

  • os: chame 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

  • Métodos de threading:

  • typing.Text (gh-92332).

  • A classe interna typing._UnionGenericAlias não é mais usada para implementar typing.Union. Para preservar a compatibilidade com usuários que utilizam esta classe privada, uma correção de compatibilidade será fornecida pelo menos até a versão 3.17 do Python. (Contribuição de Jelle Zijlstra em gh-105499.)

  • 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()

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

  • sys._clear_type_cache() está descontinuada: use sys._clear_internal_caches().

Removidos

argparse

  • Remove the type, choices, and metavar parameters of argparse.BooleanOptionalAction. They were deprecated since 3.12.

  • Calling add_argument_group() on an argument group, and calling add_argument_group() or add_mutually_exclusive_group() on a mutually exclusive group now raise exceptions. This nesting was never supported, often failed to work correctly, and was unintentionally exposed through inheritance. This functionality has been deprecated since Python 3.11. (Contributed by Savannah Ostrowski in gh-127186.)

ast

  • Remove the following classes. They were all deprecated since Python 3.8, and have emitted deprecation warnings since Python 3.12:

    • ast.Bytes

    • ast.Ellipsis

    • ast.NameConstant

    • ast.Num

    • ast.Str

    Use ast.Constant instead. As a consequence of these removals, user-defined visit_Num, visit_Str, visit_Bytes, visit_NameConstant and visit_Ellipsis methods on custom ast.NodeVisitor subclasses will no longer be called when the NodeVisitor subclass is visiting an AST. Define a visit_Constant method instead.

    Also, remove the following deprecated properties on ast.Constant, which were present for compatibility with the now-removed AST classes:

    • ast.Constant.n

    • ast.Constant.s

    Use ast.Constant.value instead. (Contributed by Alex Waygood in gh-119562.)

asyncio

  • Remove the following classes and functions. They were all deprecated and emitted deprecation warnings since Python 3.12:

    • asyncio.get_child_watcher()

    • asyncio.set_child_watcher()

    • asyncio.AbstractEventLoopPolicy.get_child_watcher()

    • asyncio.AbstractEventLoopPolicy.set_child_watcher()

    • asyncio.AbstractChildWatcher

    • asyncio.FastChildWatcher

    • asyncio.MultiLoopChildWatcher

    • asyncio.PidfdChildWatcher

    • asyncio.SafeChildWatcher

    • asyncio.ThreadedChildWatcher

    (Contributed by Kumar Aditya in gh-120804.)

  • Removed implicit creation of event loop by asyncio.get_event_loop(). It now raises a RuntimeError if there is no current event loop. (Contributed by Kumar Aditya in gh-126353.)

    There’s a few patterns that use asyncio.get_event_loop(), most of them can be replaced with asyncio.run().

    If you’re running an async function, simply use asyncio.run().

    Before:

    async def main():
        ...
    
    
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.close()
    

    After:

    async def main():
        ...
    
    asyncio.run(main())
    

    If you need to start something, for example, a server listening on a socket and then run forever, use asyncio.run() and an asyncio.Event.

    Before:

    def start_server(loop):
        ...
    
    loop = asyncio.get_event_loop()
    try:
        start_server(loop)
        loop.run_forever()
    finally:
        loop.close()
    

    After:

    def start_server(loop):
        ...
    
    async def main():
        start_server(asyncio.get_running_loop())
        await asyncio.Event().wait()
    
    asyncio.run(main())
    

    If you need to run something in an event loop, then run some blocking code around it, use asyncio.Runner.

    Before:

    async def operation_one():
        ...
    
    def blocking_code():
        ...
    
    async def operation_two():
        ...
    
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(operation_one())
        blocking_code()
        loop.run_until_complete(operation_two())
    finally:
        loop.close()
    

    After:

    async def operation_one():
        ...
    
    def blocking_code():
        ...
    
    async def operation_two():
        ...
    
    with asyncio.Runner() as runner:
        runner.run(operation_one())
        blocking_code()
        runner.run(operation_two())
    

collections.abc

  • Remove collections.abc.ByteString. It had previously raised a DeprecationWarning since Python 3.12.

email

importlib

itertools

  • Remove itertools support for copy, deepcopy, and pickle operations. These had previously raised a DeprecationWarning since Python 3.12. (Contributed by Raymond Hettinger in gh-101588.)

pathlib

  • Remove support for passing additional keyword arguments to pathlib.Path. In previous versions, any such arguments are ignored.

  • Remove support for passing additional positional arguments to pathlib.PurePath.relative_to() and is_relative_to(). In previous versions, any such arguments are joined onto other.

pkgutil

  • Remove deprecated pkgutil.get_loader() and pkgutil.find_loader(). These had previously raised a DeprecationWarning since Python 3.12. (Contributed by Bénédikt Tran in gh-97850.)

pty

sqlite3

typing

urllib

Outros

Alterações de bytecode do CPython

  • Replaced the opcode BINARY_SUBSCR by BINARY_OP with oparg NB_SUBSCR. (Contributed by Irit Katriel in gh-100239.)

Porting to Python 3.14

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

Build changes

  • GNU Autoconf 2.72 is now required to generate configure. (Contributed by Erlend Aasland in gh-115765.)

  • #pragma-based linking with python3*.lib can now be switched off with Py_NO_LINK_LIB. (Contributed by Jean-Christophe Fillion-Robin in gh-82909.)

PEP 761: Discontinuation of PGP signatures

PGP signatures will not be available for CPython 3.14 and onwards. Users verifying artifacts must use Sigstore verification materials for verifying CPython artifacts. This change in release process is specified in PEP 761.

C API changes

New features

Limited C API changes

Porting to Python 3.14

  • Py_Finalize() now deletes all interned strings. This is backwards incompatible to any C-Extension that holds onto an interned string after a call to Py_Finalize() and is then reused after a call to Py_Initialize(). Any issues arising from this behavior will normally result in crashes during the execution of the subsequent call to Py_Initialize() from accessing uninitialized memory. To fix, use an address sanitizer to identify any use-after-free coming from an interned string and deallocate it during module shutdown. (Contributed by Eddie Elizondo in gh-113601.)

  • The Unicode Exception Objects C API now raises a TypeError if its exception argument is not a UnicodeError object. (Contributed by Bénédikt Tran in gh-127691.)

Descontinuados

Remoção pendente no Python 3.15

Remoção pendente no Python 3.18

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.

Removidos

  • Creating immutable types with mutable bases was deprecated since 3.12 and now raises a TypeError.

  • Remove PyDictObject.ma_version_tag member which was deprecated since Python 3.12. Use the PyDict_AddWatcher() API instead. (Contributed by Sam Gross in gh-124296.)

  • Remove the private _Py_InitializeMain() function. It was a provisional API added to Python 3.8 by PEP 587. (Contributed by Victor Stinner in gh-129033.)

  • The undocumented APIs Py_C_RECURSION_LIMIT and PyThreadState.c_recursion_remaining, added in 3.13, are removed without a deprecation period. Please use Py_EnterRecursiveCall() to guard against runaway recursion in C code. (Removed in gh-133079, see also gh-130396.)