What's new in Python 3.15
****************************
-:Editor: TBD
+:Editor: Hugo van Kemenade
.. Rules for maintenance:
so it's worth checking back even after reading earlier versions.
-Summary --- release highlights
-==============================
+Summary -- Release highlights
+=============================
.. This section singles out the most important changes in Python 3.15.
Brevity is key.
.. PEP-sized items next.
+* :pep:`799`: :ref:`A dedicated profiling package for organizing Python
+ profiling tools <whatsnew315-sampling-profiler>`
+* :pep:`686`: :ref:`Python now uses UTF-8 as the default encoding
+ <whatsnew315-utf8-default>`
+* :pep:`782`: :ref:`A new PyBytesWriter C API to create a Python bytes object
+ <whatsnew315-pep782>`
+* :ref:`Improved error messages <whatsnew315-improved-error-messages>`
New features
.. _whatsnew315-sampling-profiler:
-High frequency statistical sampling profiler
---------------------------------------------
+:pep:`799`: High frequency statistical sampling profiler
+--------------------------------------------------------
A new statistical sampling profiler has been added to the new :mod:`!profiling` module as
:mod:`!profiling.sampling`. This profiler enables low-overhead performance analysis of
* **Multiple output formats**: Generate both detailed statistics and flamegraph data
* **Thread-aware profiling**: Option to profile all threads or just the main thread
-Profile process 1234 for 10 seconds with default settings::
+Profile process 1234 for 10 seconds with default settings:
+
+.. code-block:: shell
python -m profiling.sampling 1234
-Profile with custom interval and duration, save to file::
+Profile with custom interval and duration, save to file:
+
+.. code-block:: shell
python -m profiling.sampling -i 50 -d 30 -o profile.stats 1234
-Generate collapsed stacks for flamegraph::
+Generate collapsed stacks for flamegraph:
+
+.. code-block:: shell
python -m profiling.sampling --collapsed 1234
-Profile all threads and sort by total time::
+Profile all threads and sort by total time:
+
+.. code-block:: shell
python -m profiling.sampling -a --sort-tottime 1234
-The profiler generates statistical estimates of where time is spent::
+The profiler generates statistical estimates of where time is spent:
+
+.. code-block:: text
Real-time sampling stats: Mean: 100261.5Hz (9.97µs) Min: 86333.4Hz (11.58µs) Max: 118807.2Hz (8.42µs) Samples: 400001
Captured 498841 samples in 5.00 seconds
This capability is particularly valuable for debugging performance issues in
production systems where traditional profiling approaches would be too intrusive.
+ .. seealso:: :pep:`799` for further details.
+
(Contributed by Pablo Galindo and László Kiss Kollár in :gh:`135953`.)
+.. _whatsnew315-improved-error-messages:
+
Improved error messages
-----------------------
Other language changes
======================
+.. _whatsnew315-utf8-default:
+
* Python now uses UTF-8_ as the default encoding, independent of the system's
environment. This means that I/O operations without an explicit encoding,
- e.g. ``open('flying-circus.txt')``, will use UTF-8.
+ for example, ``open('flying-circus.txt')``, will use UTF-8.
UTF-8 is a widely-supported Unicode_ character encoding that has become a
*de facto* standard for representing text, including nearly every webpage
on the internet, many common file formats, programming languages, and more.
To retain the previous behaviour, Python's UTF-8 mode may be disabled with
the :envvar:`PYTHONUTF8=0 <PYTHONUTF8>` environment variable or the
- :option:`-X utf8=0 <-X>` command line option.
+ :option:`-X utf8=0 <-X>` command-line option.
.. seealso:: :pep:`686` for further details.
------
* :func:`~locale.setlocale` now supports language codes with ``@``-modifiers.
- ``@``-modifier are no longer silently removed in :func:`~locale.getlocale`,
+ ``@``-modifiers are no longer silently removed in :func:`~locale.getlocale`,
but included in the language code.
(Contributed by Serhiy Storchaka in :gh:`137729`.)
-Deprecated
-==========
-
-CLI
----
-
-* Deprecate :option:`-b` and :option:`!-bb` command line options
- and schedule them to become no-op in Python 3.17.
- These were primarily helpers for the Python 2 -> 3 transition.
- Starting with Python 3.17, no :exc:`BytesWarning` will be raised
- for these cases; use a type checker instead.
-
- (Contributed by Nikita Sobolev in :gh:`136355`.)
-
-hashlib
--------
-
-* In hash function constructors such as :func:`~hashlib.new` or the
- direct hash-named constructors such as :func:`~hashlib.md5` and
- :func:`~hashlib.sha256`, their optional initial data parameter could
- also be passed a keyword argument named ``data=`` or ``string=`` in
- various :mod:`hashlib` implementations.
-
- Support for the ``string`` keyword argument name is now deprecated and
- is slated for removal in Python 3.19. Prefer passing the initial data as
- a positional argument for maximum backwards compatibility.
-
- (Contributed by Bénédikt Tran in :gh:`134978`.)
-
-__version__
------------
-
-* The ``__version__`` attribute has been deprecated in these standard library
- modules and will be removed in Python 3.20.
- Use :py:data:`sys.version_info` instead.
-
- - :mod:`argparse`
- - :mod:`csv`
- - :mod:`!ctypes.macholib`
- - :mod:`ipaddress`
- - :mod:`json`
- - :mod:`logging` (``__date__`` also deprecated)
- - :mod:`optparse`
- - :mod:`pickle`
- - :mod:`platform`
- - :mod:`re`
- - :mod:`socketserver`
- - :mod:`tabnanny`
- - :mod:`tkinter.font`
- - :mod:`tkinter.ttk`
-
- (Contributed by Hugo van Kemenade in :gh:`76007`.)
-
-.. Add deprecations above alphabetically, not here at the end.
-
-.. include:: ../deprecations/pending-removal-in-3.16.rst
-
-.. include:: ../deprecations/pending-removal-in-3.17.rst
-
-.. include:: ../deprecations/pending-removal-in-3.19.rst
-
-.. include:: ../deprecations/pending-removal-in-3.20.rst
-
-.. include:: ../deprecations/pending-removal-in-future.rst
-
Removed
=======
(Contributed by Semyon Moroz in :gh:`138044`)
+mimetypes
+---------
+
+* Add ``application/toml``. (Contributed by Gil Forcada in :gh:`139959`.)
+
+
pathlib
-------
* Code like ``class B2(A[T2], Protocol[T1, T2]): ...`` now correctly handles
type parameters order: it is ``(T1, T2)``, not ``(T2, T1)``
- as it was incorrectly infered in runtime before.
+ as it was incorrectly inferred in runtime before.
(Contributed by Nikita Sobolev in :gh:`137191`.)
* :class:`typing.ByteString` has been removed from ``typing.__all__``.
(Contributed by Jiahao Li in :gh:`133656`.)
-Porting to Python 3.15
-======================
+Deprecated
+==========
-This section lists previously described changes and other bugfixes
-that may require changes to your code.
+New deprecations
+----------------
+* CLI:
-Build changes
-=============
+ * Deprecate :option:`-b` and :option:`!-bb` command-line options
+ and schedule them to become no-op in Python 3.17.
+ These were primarily helpers for the Python 2 -> 3 transition.
+ Starting with Python 3.17, no :exc:`BytesWarning` will be raised
+ for these cases; use a type checker instead.
-* Removed implicit fallback to the bundled copy of the ``libmpdec`` library.
- Now this should be explicitly enabled with :option:`--with-system-libmpdec`
- set to ``no`` or with :option:`!--without-system-libmpdec`.
- (Contributed by Sergey B Kirpichev in :gh:`115119`.)
+ (Contributed by Nikita Sobolev in :gh:`136355`.)
+
+* :mod:`hashlib`:
+
+ * In hash function constructors such as :func:`~hashlib.new` or the
+ direct hash-named constructors such as :func:`~hashlib.md5` and
+ :func:`~hashlib.sha256`, their optional initial data parameter could
+ also be passed a keyword argument named ``data=`` or ``string=`` in
+ various :mod:`hashlib` implementations.
+
+ Support for the ``string`` keyword argument name is now deprecated and
+ is slated for removal in Python 3.19. Prefer passing the initial data as
+ a positional argument for maximum backwards compatibility.
+
+ (Contributed by Bénédikt Tran in :gh:`134978`.)
+
+* ``__version__``
+
+ * The ``__version__`` attribute has been deprecated in these standard library
+ modules and will be removed in Python 3.20.
+ Use :py:data:`sys.version_info` instead.
+
+ - :mod:`argparse`
+ - :mod:`csv`
+ - :mod:`!ctypes.macholib`
+ - :mod:`ipaddress`
+ - :mod:`json`
+ - :mod:`logging` (``__date__`` also deprecated)
+ - :mod:`optparse`
+ - :mod:`pickle`
+ - :mod:`platform`
+ - :mod:`re`
+ - :mod:`socketserver`
+ - :mod:`tabnanny`
+ - :mod:`tkinter.font`
+ - :mod:`tkinter.ttk`
+
+ (Contributed by Hugo van Kemenade in :gh:`76007`.)
+
+.. Add deprecations above alphabetically, not here at the end.
+
+.. include:: ../deprecations/pending-removal-in-3.16.rst
+
+.. include:: ../deprecations/pending-removal-in-3.17.rst
+
+.. include:: ../deprecations/pending-removal-in-3.19.rst
+
+.. include:: ../deprecations/pending-removal-in-3.20.rst
+
+.. include:: ../deprecations/pending-removal-in-future.rst
C API changes
and :c:data:`Py_mod_abi`.
(Contributed by Petr Viktorin in :gh:`137210`.)
+.. _whatsnew315-pep782:
+
* Implement :pep:`782`, the :ref:`PyBytesWriter API <pybyteswriter>`.
Add functions:
underlying syscall, instead of raising a :exc:`SystemError`.
-Deprecated C APIs
------------------
-
-* For unsigned integer formats in :c:func:`PyArg_ParseTuple`,
- accepting Python integers with value that is larger than the maximal value
- for the C type or less than the minimal value for the corresponding
- signed integer type of the same size is now deprecated.
- (Contributed by Serhiy Storchaka in :gh:`132629`.)
-
-* :c:func:`PyBytes_FromStringAndSize(NULL, len) <PyBytes_FromStringAndSize>`
- and :c:func:`_PyBytes_Resize` are :term:`soft deprecated`,
- use the :c:type:`PyBytesWriter` API instead.
- (Contributed by Victor Stinner in :gh:`129813`.)
-
-* Deprecate :c:member:`~PyComplexObject.cval` field of the the
- :c:type:`PyComplexObject` type.
- Use :c:func:`PyComplex_AsCComplex` and :c:func:`PyComplex_FromCComplex`
- to convert a Python complex number to/from the C :c:type:`Py_complex`
- representation.
- (Contributed by Sergey B Kirpichev in :gh:`128813`.)
-
-* Functions :c:func:`_Py_c_sum`, :c:func:`_Py_c_diff`, :c:func:`_Py_c_neg`,
- :c:func:`_Py_c_prod`, :c:func:`_Py_c_quot`, :c:func:`_Py_c_pow` and
- :c:func:`_Py_c_abs` are :term:`soft deprecated`.
- (Contributed by Sergey B Kirpichev in :gh:`128813`.)
-
-* :c:member:`~PyConfig.bytes_warning` is deprecated
- since 3.15 and will be removed in 3.17.
- (Contributed by Nikita Sobolev in :gh:`136355`.)
-
-
-.. Add C API deprecations above alphabetically, not here at the end.
-
Removed C APIs
--------------
.. |pythoncapi_compat_project| replace:: |pythoncapi_compat_project_link|_
.. |pythoncapi_compat_project_link| replace:: pythoncapi-compat project
.. _pythoncapi_compat_project_link: https://github.com/python/pythoncapi-compat
+
+
+Deprecated C APIs
+-----------------
+
+* For unsigned integer formats in :c:func:`PyArg_ParseTuple`,
+ accepting Python integers with value that is larger than the maximal value
+ for the C type or less than the minimal value for the corresponding
+ signed integer type of the same size is now deprecated.
+ (Contributed by Serhiy Storchaka in :gh:`132629`.)
+
+* :c:func:`PyBytes_FromStringAndSize(NULL, len) <PyBytes_FromStringAndSize>`
+ and :c:func:`_PyBytes_Resize` are :term:`soft deprecated`,
+ use the :c:type:`PyBytesWriter` API instead.
+ (Contributed by Victor Stinner in :gh:`129813`.)
+
+* Deprecate :c:member:`~PyComplexObject.cval` field of the the
+ :c:type:`PyComplexObject` type.
+ Use :c:func:`PyComplex_AsCComplex` and :c:func:`PyComplex_FromCComplex`
+ to convert a Python complex number to/from the C :c:type:`Py_complex`
+ representation.
+ (Contributed by Sergey B Kirpichev in :gh:`128813`.)
+
+* Functions :c:func:`_Py_c_sum`, :c:func:`_Py_c_diff`, :c:func:`_Py_c_neg`,
+ :c:func:`_Py_c_prod`, :c:func:`_Py_c_quot`, :c:func:`_Py_c_pow` and
+ :c:func:`_Py_c_abs` are :term:`soft deprecated`.
+ (Contributed by Sergey B Kirpichev in :gh:`128813`.)
+
+* :c:member:`~PyConfig.bytes_warning` is deprecated
+ since 3.15 and will be removed in 3.17.
+ (Contributed by Nikita Sobolev in :gh:`136355`.)
+
+
+.. Add C API deprecations above alphabetically, not here at the end.
+
+
+Build changes
+=============
+
+* Removed implicit fallback to the bundled copy of the ``libmpdec`` library.
+ Now this should be explicitly enabled with :option:`--with-system-libmpdec`
+ set to ``no`` or with :option:`!--without-system-libmpdec`.
+ (Contributed by Sergey B Kirpichev in :gh:`115119`.)
+
+
+Porting to Python 3.15
+======================
+
+This section lists previously described changes and other bugfixes
+that may require changes to your code.