What’s new in Python 3.16

Editor:

TBD

This article explains the new features in Python 3.16, compared to 3.15.

For full details, see the changelog.

Note

Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.16 moves towards release, so it’s worth checking back even after reading earlier versions.

Summary — release highlights

New features

PEP 828: Supporting yield from in asynchronous generators

Use of the yield from construct and the return statement with a non-None value is now allowed in an asynchronous generator function. For example, the following code would previously raise a SyntaxError:

async def agenerator():
   yield 1
   yield from range(2, 5)  # Now allowed!
   return 5  # Now allowed!

Additionally, there is a new async yield from statement to delegate to an asynchronous generator:

async def sleepy_range(start, stop):
   for number in range(start, stop):
      await asyncio.sleep(1)
      yield number

async def agenerator():
   yield 1
   async yield from sleepy_range(2, 5)
   yield 5

Similar to yield from, async yield from may also be used as an expression, in which case the return of the async generator is used.

For example:

async def asubgenerator():
   yield 1
   yield 2
   return 3

async def agenerator():
   value = async yield from asubgenerator()
   print(value)  # 3

See also

PEP 803 for further details.

Other language changes

New modules

  • None yet.

Improved modules

os

  • Add os.pidfd_getfd() for duplicating a file descriptor from another process via a pidfd. Available on Linux 5.6+. (Contributed by Maurycy Pawłowski-Wieroński in gh-149464.)

Optimizations

module_name

  • TODO

Removed

annotationlib

asyncio

functools

  • Calling the Python implementation of functools.reduce() with function or sequence as keyword arguments has been deprecated since Python 3.14.

logging

  • Support for custom logging handlers with the strm argument is deprecated and scheduled for removal in Python 3.16. Define handlers with the stream argument instead.

mimetypes

shutil

  • The ExecError exception which has been deprecated since Python 3.14. It has not been used by any function in shutil since Python 3.4. (Contributed by Stan Ulbrych in gh-149567.)

symtable

  • The symtable.Class.get_methods() method which has been deprecated since Python 3.14.

sys

  • The _enablelegacywindowsfsencoding() function which has been deprecated since Python 3.13. Use the PYTHONLEGACYWINDOWSFSENCODING environment variable instead. (Contributed by Stan Ulbrych in gh-149595.)

sysconfig

  • The sysconfig.expand_makefile_vars() function which has been deprecated since Python 3.14. Use the vars argument of sysconfig.get_paths() instead. (Contributed by Stan Ulbrych in gh-149499.)

tarfile

  • The undocumented and unused tarfile.TarFile.tarfile attribute has been deprecated since Python 3.13.

Deprecated

  • ast:

    • Classes slice, Index, ExtSlice, Suite, Param, AugLoad and AugStore, deprecated since Python 3.9, are no longer imported by from ast import * and issue a deprecation warning on use. The classes are slated for removal in Python 3.21. These types are not generated by the parser or accepted by the code generator.

    • The dims property of ast.Tuple objects, deprecated since Python 3.9, now issues a deprecation warning on use. This property is slated for removal in 3.21. Use ast.Tuple.elts instead.

Porting to Python 3.16

This section lists previously described changes and other bugfixes that may require changes to your code.

Build changes

  • Remove the bundled copy of the libmpdec decimal library from the CPython source tree to simplify maintenence and updates. The decimal module will now unconditionally use the system’s libmpdec decimal library. Also remove the now unused --with-system-libmpdec configure flag. This change has no impact on binary releases of Python, which have been built against a separate copy of libmpdec for the past several releases.

    (Contributed by Sergey B Kirpichev in gh-115119.)

C API changes

New features

  • TODO

Porting to Python 3.16

  • TODO

Deprecated C APIs

  • TODO

Removed C APIs