Pending removal in future versions
----------------------------------

The following APIs will be removed in the future,
although there is currently no date scheduled for their removal.

* :mod:`argparse`:

  * Nesting argument groups and nesting mutually exclusive
    groups are deprecated.
  * Passing the undocumented keyword argument *prefix_chars* to
    :meth:`~argparse.ArgumentParser.add_argument_group` is now
    deprecated.
  * The :class:`argparse.FileType` type converter is deprecated.

* :mod:`builtins`:

  * Generators: ``throw(type, exc, tb)`` and ``athrow(type, exc, tb)``
    signature is deprecated: use ``throw(exc)`` and ``athrow(exc)`` instead,
    the single argument signature.
  * Currently Python accepts numeric literals immediately followed by keywords,
    for example ``0in x``, ``1or x``, ``0if 1else 2``.  It allows confusing and
    ambiguous expressions like ``[0x1for x in y]`` (which can be interpreted as
    ``[0x1 for x in y]`` or ``[0x1f or x in y]``).  A syntax warning is raised
    if the numeric literal is immediately followed by one of keywords
    :keyword:`and`, :keyword:`else`, :keyword:`for`, :keyword:`if`,
    :keyword:`in`, :keyword:`is` and :keyword:`or`.  In a future release it
    will be changed to a syntax error. (:gh:`87999`)
  * Support for ``__index__()`` and ``__int__()`` method returning non-int type:
    these methods will be required to return an instance of a strict subclass of
    :class:`int`.
  * Support for ``__float__()`` method returning a strict subclass of
    :class:`float`: these methods will be required to return an instance of
    :class:`float`.
  * Support for ``__complex__()`` method returning a strict subclass of
    :class:`complex`: these methods will be required to return an instance of
    :class:`complex`.
  * Passing a complex number as the *real* or *imag* argument in the
    :func:`complex` constructor is now deprecated; it should only be passed
    as a single positional argument.
    (Contributed by Serhiy Storchaka in :gh:`109218`.)

* :mod:`calendar`: ``calendar.January`` and ``calendar.February`` constants are
  deprecated and replaced by :data:`calendar.JANUARY` and
  :data:`calendar.FEBRUARY`.
  (Contributed by Prince Roshan in :gh:`103636`.)

* :mod:`codecs`: use :func:`open` instead of :func:`codecs.open`. (:gh:`133038`)

* :attr:`!codeobject.co_lnotab`: use the :meth:`codeobject.co_lines` method
  instead.

* :mod:`datetime`:

  * :meth:`~datetime.datetime.utcnow`:
    use ``datetime.datetime.now(tz=datetime.UTC)``.
  * :meth:`~datetime.datetime.utcfromtimestamp`:
    use ``datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)``.

* :mod:`gettext`: Plural value must be an integer.

* :mod:`importlib`:

  * :func:`~importlib.util.cache_from_source` *debug_override* parameter is
    deprecated: use the *optimization* parameter instead.

* :mod:`importlib.metadata`:

  * ``EntryPoints`` tuple interface.
  * Implicit ``None`` on return values.

* :mod:`logging`: the ``warn()`` method has been deprecated
  since Python 3.3, use :meth:`~logging.warning` instead.

* :mod:`mailbox`: Use of StringIO input and text mode is deprecated, use
  BytesIO and binary mode instead.

* :mod:`os`: Calling :func:`os.register_at_fork` in a multi-threaded process.

* :mod:`os.path`: :func:`os.path.commonprefix` is deprecated, use
  :func:`os.path.commonpath` for path prefixes. The :func:`os.path.commonprefix`
  function is being deprecated due to having a misleading name and module.
  The function is not safe to use for path prefixes despite being included in a
  module about path manipulation, meaning it is easy to accidentally
  introduce path traversal vulnerabilities into Python programs by using this
  function.

* :class:`!pydoc.ErrorDuringImport`: A tuple value for *exc_info* parameter is
  deprecated, use an exception instance.

* :mod:`re`: More strict rules are now applied for numerical group references
  and group names in regular expressions.  Only sequence of ASCII digits is now
  accepted as a numerical reference.  The group name in bytes patterns and
  replacement strings can now only contain ASCII letters and digits and
  underscore.
  (Contributed by Serhiy Storchaka in :gh:`91760`.)

* :mod:`shutil`: :func:`~shutil.rmtree`'s *onerror* parameter is deprecated in
  Python 3.12; use the *onexc* parameter instead.

* :mod:`ssl` options and protocols:

  * :class:`ssl.SSLContext` without protocol argument is deprecated.
  * :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and
    :meth:`!selected_npn_protocol` are deprecated: use ALPN
    instead.
  * ``ssl.OP_NO_SSL*`` options
  * ``ssl.OP_NO_TLS*`` options
  * ``ssl.PROTOCOL_SSLv3``
  * ``ssl.PROTOCOL_TLS``
  * ``ssl.PROTOCOL_TLSv1``
  * ``ssl.PROTOCOL_TLSv1_1``
  * ``ssl.PROTOCOL_TLSv1_2``
  * ``ssl.TLSVersion.SSLv3``
  * ``ssl.TLSVersion.TLSv1``
  * ``ssl.TLSVersion.TLSv1_1``

* :mod:`threading` methods:

  * :meth:`!threading.Condition.notifyAll`: use :meth:`~threading.Condition.notify_all`.
  * :meth:`!threading.Event.isSet`: use :meth:`~threading.Event.is_set`.
  * :meth:`!threading.Thread.isDaemon`, :meth:`threading.Thread.setDaemon`:
    use :attr:`threading.Thread.daemon` attribute.
  * :meth:`!threading.Thread.getName`, :meth:`threading.Thread.setName`:
    use :attr:`threading.Thread.name` attribute.
  * :meth:`!threading.currentThread`: use :meth:`threading.current_thread`.
  * :meth:`!threading.activeCount`: use :meth:`threading.active_count`.

* :class:`typing.Text` (:gh:`92332`).

* The internal class ``typing._UnionGenericAlias`` is no longer used to implement
  :class:`typing.Union`. To preserve compatibility with users using this private
  class, a compatibility shim will be provided until at least Python 3.17. (Contributed by
  Jelle Zijlstra in :gh:`105499`.)

* :class:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value
  that is not ``None`` from a test case.

* :mod:`urllib.parse` deprecated functions: :func:`~urllib.parse.urlparse` instead

  * ``splitattr()``
  * ``splithost()``
  * ``splitnport()``
  * ``splitpasswd()``
  * ``splitport()``
  * ``splitquery()``
  * ``splittag()``
  * ``splittype()``
  * ``splituser()``
  * ``splitvalue()``
  * ``to_bytes()``

* :mod:`wsgiref`: ``SimpleHandler.stdout.write()`` should not do partial
  writes.

* :mod:`xml.etree.ElementTree`: Testing the truth value of an
  :class:`~xml.etree.ElementTree.Element` is deprecated. In a future release it
  will always return ``True``. Prefer explicit ``len(elem)`` or
  ``elem is not None`` tests instead.

* :func:`sys._clear_type_cache` is deprecated:
  use :func:`sys._clear_internal_caches` instead.
