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


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


xml
---

* Add support for multiple multi-byte encodings in the "XML parser":
  "cp932", "cp949", "cp950", "Big5","EUC-JP", "GB2312", "GBK",
  "johab", and "Shift_JIS". Add partial support (only BMP characters)
  for multi-byte encodings "Big5-HKSCS", "EUC_JIS-2004",
  "EUC_JISX0213", "Shift_JIS-2004", "Shift_JISX0213", "utf-8-sig" and
  non-standard aliases like "UTF8" (without hyphen). The parser now
  raises "ValueError" for known unsupported multi-byte encodings such
  us "ISO-2022-JP" or "raw-unicode-escape" instead of failing later,
  when encounter non-ASCII data. (Contributed by Serhiy Storchaka in
  gh-62259.)


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

* Add a "--with-build-details-suffix" configure flag to allow Linux
  distributions that co-install multiple versions of Python in the
  same tree to avoid "build-details.json" clashes.

  (Contributed by Stefano Rivera in gh-131372.)


C API changes
=============


New features
------------

* TODO


Porting to Python 3.16
----------------------

* TODO


Deprecated C APIs
-----------------

* TODO


Removed C APIs
--------------
