| Release: | |release| |
|---|---|
| Date: | |today| |
This article explains the new features in Python 3.10, compared to 3.9.
For full details, see the :ref:`changelog <changelog>`.
Note
Prerelease users should be aware that this document is currently in draft form. It will be updated substantially as Python 3.10 moves towards release, so it's worth checking back even after reading earlier versions.
- The :class:`int` type has a new method :meth:`int.bit_count`, returning the number of ones in the binary expansion of a given integer, also known as the population count. (Contributed by Niklas Fiekas in :issue:`29882`.)
- The views returned by :meth:`dict.keys`, :meth:`dict.values` and
:meth:`dict.items` now all have a
mappingattribute that gives a :class:`types.MappingProxyType` object wrapping the original dictionary. (Contributed by Dennis Sweeney in :issue:`40890`.)
- Builtin and extension functions that take integer arguments no longer accept :class:`~decimal.Decimal`s, :class:`~fractions.Fraction`s and other objects that can be converted to integers only with a loss (e.g. that have the :meth:`~object.__int__` method but do not have the :meth:`~object.__index__` method). (Contributed by Serhiy Storchaka in :issue:`37999`.)
- None yet.
This section lists previously described changes and other bugfixes that may require changes to your code.
- The C99 functions :c:func:`snprintf` and :c:func:`vsnprintf` are now required to build Python. (Contributed by Victor Stinner in :issue:`36020`.)
- :mod:`sqlite3` requires SQLite 3.7.3 or higher. (Contributed by Sergey Fedoseev and Erlend E. Aasland :issue:`40744`.)
The result of :c:func:`PyNumber_Index` now always has exact type :class:`int`.
Previously, the result could have been an instance of a subclass of int.
(Contributed by Serhiy Storchaka in :issue:`40792`.)
Since :c:func:`Py_TYPE()` is changed to the inline static function,
Py_TYPE(obj) = new_typemust be replaced withPy_SET_TYPE(obj, new_type): see :c:func:`Py_SET_TYPE()` (available since Python 3.9). For backward compatibility, this macro can be used:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_TYPE(obj, type) ((Py_TYPE(obj) = (type)), (void)0) #endif
(Contributed by Dong-hee Na in :issue:`39573`.)
Since :c:func:`Py_REFCNT()` is changed to the inline static function,
Py_REFCNT(obj) = new_refcntmust be replaced withPy_SET_REFCNT(obj, new_refcnt): see :c:func:`Py_SET_REFCNT()` (available since Python 3.9). For backward compatibility, this macro can be used:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0) #endif
(Contributed by Victor Stinner in :issue:`39573`.)
Since :c:func:`Py_SIZE()` is changed to the inline static function,
Py_SIZE(obj) = new_sizemust be replaced withPy_SET_SIZE(obj, new_size): see :c:func:`Py_SET_SIZE()` (available since Python 3.9). For backward compatibility, this macro can be used:#if PY_VERSION_HEX < 0x030900A4 # define Py_SET_SIZE(obj, size) ((Py_SIZE(obj) = (size)), (void)0) #endif
(Contributed by Victor Stinner in :issue:`39573`.)
Calling :c:func:`PyDict_GetItem` without :term:`GIL` held had been allowed for historical reason. It is no longer allowed. (Contributed by Victor Stinner in :issue:`40839`.)