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

Informacja

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

## Other language changes

## New modules

- None yet.

## Improved modules

### gzip

- `gzip.open()` now accepts an optional argument `mtime` which is passed on to the constructor of the `GzipFile` class. (Contributed by Marin Misur in gh-91372.)

### 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

- The `annotationlib.ForwardRef._evaluate()` method which has been deprecated since Python 3.14. Use `annotationlib.ForwardRef.evaluate()` or `typing.evaluate_forward_ref()` instead.

### asyncio

- The `asyncio.iscoroutinefunction()` which has been deprecated since Python 3.14. Use `inspect.iscoroutinefunction()` instead.

### 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

- Valid extensions start with a «.» or are empty for `mimetypes.MimeTypes.add_type()`. Undotted extensions now raise a `ValueError`.

### 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