.. _python_310: Python 3.10 =========== Python 3.10.0 (final) was released on the 4 October 2021. The Features for 3.10 are defined in `PEP 619 `_ and a detailed description of the changes can be found in `What's New in Python 3.10 `_. .. table:: :widths: 20 60 20 +--------------------------------------------------------+----------------------------------------------------+--------------+ | **New syntax features** | **Status** | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 634 `_ | Structural Pattern Matching: Specification | [#spm]_ | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 635 `_ | Structural Pattern Matching: Motivation and | [#spm]_ | | | Rationale | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 636 `_ | Structural Pattern Matching: Tutorial | [#spm]_ | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `bpo-12782 | Parenthesized context managers are now officially | | | `_ | allowed | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | **New features in the standard library** | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 618 `_ | Add Optional Length-Checking To zip | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | **Interpreter improvements** | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 626 `_ | Precise line numbers for debugging and other tools | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | **New typing features** | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 604 `_ | Allow writing union types as X | Y | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 613 `_ | Explicit Type Aliases | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 612 `_ | Parameter Specification Variables | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | **Important deprecations, removals or restrictions** | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 644 `_ | Require OpenSSL 1.1.1 or newer | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 632 `_ | Deprecate distutils module. | Not relevant | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 623 `_ | Deprecate and prepare for the removal of the wstr | Not relevant | | | member in PyUnicodeObject. | | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 624 `_ | Remove Py_UNICODE encoder APIs | Not relevant | +--------------------------------------------------------+----------------------------------------------------+--------------+ | `PEP 597 `_ | Add optional EncodingWarning | | +--------------------------------------------------------+----------------------------------------------------+--------------+ Other Language Changes: .. table:: :widths: 90 10 +-------------------------------------------------------------------------------------------------------------+---------------+ | 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. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | The views returned by :meth:`dict.keys`, :meth:`dict.values` and | | | :meth:`dict.items` now all have a ``mapping`` attribute that gives a | | | :class:`types.MappingProxyType` object wrapping the original | | | dictionary. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | :pep:`618`: The :func:`zip` function now has an optional ``strict`` flag, used | | | to require that all the iterables have an equal length. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | 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). | | +-------------------------------------------------------------------------------------------------------------+---------------+ | If :func:`object.__ipow__` returns :const:`NotImplemented`, the operator will | | | correctly fall back to :func:`object.__pow__` and :func:`object.__rpow__` as expected. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Assignment expressions can now be used unparenthesized within set literals | | | and set comprehensions, as well as in sequence indexes (but not slices). | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Functions have a new ``__builtins__`` attribute which is used to look for | | | builtin symbols when a function is executed, instead of looking into | | | ``__globals__['__builtins__']``. The attribute is initialized from | | | ``__globals__["__builtins__"]`` if it exists, else from the current builtins. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Two new builtin functions -- :func:`aiter` and :func:`anext` have been added | | | to provide asynchronous counterparts to :func:`iter` and :func:`next`, | | | respectively. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Static methods (:func:`@staticmethod `) and class methods | | | (:func:`@classmethod `) now inherit the method attributes | | | (``__module__``, ``__name__``, ``__qualname__``, ``__doc__``, | | | ``__annotations__``) and have a new ``__wrapped__`` attribute. | | | Moreover, static methods are now callable as regular functions. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Annotations for complex targets (everything beside ``simple name`` targets | | | defined by :pep:`526`) no longer cause any runtime effects with ``from __future__ import annotations``. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Class and module objects now lazy-create empty annotations dicts on demand. | | | The annotations dicts are stored in the object’s ``__dict__`` for | | | backwards compatibility. This improves the best practices for working | | | with ``__annotations__``. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Annotations consist of ``yield``, ``yield from``, ``await`` or named expressions | | | are now forbidden under ``from __future__ import annotations`` due to their side | | | effects. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Usage of unbound variables, ``super()`` and other expressions that might | | | alter the processing of symbol table as annotations are now rendered | | | effectless under ``from __future__ import annotations``. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | Hashes of NaN values of both :class:`float` type and | | | :class:`decimal.Decimal` type now depend on object identity. Formerly, they | | | always hashed to ``0`` even though NaN values are not equal to one another. | | | This caused potentially quadratic runtime behavior due to excessive hash | | | collisions when creating dictionaries and sets containing multiple NaNs. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | A :exc:`SyntaxError` (instead of a :exc:`NameError`) will be raised when deleting | | | the :const:`__debug__` constant. | | +-------------------------------------------------------------------------------------------------------------+---------------+ | :exc:`SyntaxError` exceptions now have ``end_lineno`` and | | | ``end_offset`` attributes. They will be ``None`` if not determined. | | +-------------------------------------------------------------------------------------------------------------+---------------+ Changes to built-in modules: .. table:: :widths: 90 10 +---------------------------------------------------------------------------------------------------------------+---------------+ | `asyncio `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add missing :meth:`~asyncio.events.AbstractEventLoop.connect_accepted_socket` | | | method. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `array `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | The :meth:`~array.array.index` method of :class:`array.array` now has | | | optional *start* and *stop* parameters. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `gc `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add audit hooks for :func:`gc.get_objects`, :func:`gc.get_referrers` and | | | :func:`gc.get_referents`. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `hashlib `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | The hashlib module requires OpenSSL 1.1.1 or newer. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The hashlib module has preliminary support for OpenSSL 3.0.0. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The pure-Python fallback of :func:`~hashlib.pbkdf2_hmac` is deprecated. In | | | the future PBKDF2-HMAC will only be available when Python has been built with | | | OpenSSL support. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `os `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :func:`os.cpu_count()` support for VxWorks RTOS. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add a new function :func:`os.eventfd` and related helpers to wrap the | | | ``eventfd2`` syscall on Linux. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :func:`os.splice()` that allows to move data between two file | | | descriptors without copying between kernel address space and user | | | address space, where one of the file descriptors must refer to a | | | pipe. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :data:`~os.O_EVTONLY`, :data:`~os.O_FSYNC`, :data:`~os.O_SYMLINK` | | | and :data:`~os.O_NOFOLLOW_ANY` for macOS. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `platform `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :func:`platform.freedesktop_os_release()` to retrieve operation system | | | identification from `freedesktop.org os-release | | | `_ standard file. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `socket `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | The exception :exc:`socket.timeout` is now an alias of :exc:`TimeoutError`. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add option to create MPTCP sockets with ``IPPROTO_MPTCP``. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add ``IP_RECVTOS`` option to receive the type of service (ToS) or DSCP/ECN fields. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `ssl `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | The ssl module requires OpenSSL 1.1.1 or newer. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The ssl module has preliminary support for OpenSSL 3.0.0 and new option | | | :data:`~ssl.OP_IGNORE_UNEXPECTED_EOF`. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Deprecated function and use of deprecated constants now result in | | | a :exc:`DeprecationWarning`. :attr:`ssl.SSLContext.options` has | | | :data:`~ssl.OP_NO_SSLv2` and :data:`~ssl.OP_NO_SSLv3` set by default and | | | therefore cannot warn about setting the flag again. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The ssl module now has more secure default settings. Ciphers without forward | | | secrecy or SHA-1 MAC are disabled by default. Security level 2 prohibits | | | weak RSA, DH, and ECC keys with less than 112 bits of security. | | | :class:`~ssl.SSLContext` defaults to minimum protocol version TLS 1.2. | | | Settings are based on Hynek Schlawack's research. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The deprecated protocols SSL 3.0, TLS 1.0, and TLS 1.1 are no longer | | | officially supported. Python does not block them actively. However | | | OpenSSL build options, distro configurations, vendor patches, and cipher | | | suites may prevent a successful handshake. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add a *timeout* parameter to the :func:`ssl.get_server_certificate` function. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | The ssl module uses heap-types and multi-phase initialization. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | A new verify flag :data:`~ssl.VERIFY_X509_PARTIAL_CHAIN` has been added. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `sys `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :data:`sys.orig_argv` attribute: the list of the original command line | | | arguments passed to the Python executable. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | Add :data:`sys.stdlib_module_names`, containing the list of the standard library | | | module names. | | +---------------------------------------------------------------------------------------------------------------+---------------+ | `_thread `_ | +---------------------------------------------------------------------------------------------------------------+---------------+ | :func:`_thread.interrupt_main` now takes an optional signal number to | | | simulate (the default is still :data:`signal.SIGINT`). | | +---------------------------------------------------------------------------------------------------------------+---------------+ .. rubric:: Notes .. [#spm] The structural pattern matching feature is discussed in `issue #7847 `_.