Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

gh-105373: Doc lists pending removals #106540

Merged
merged 1 commit into from
Jul 9, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
299 changes: 296 additions & 3 deletions Doc/whatsnew/3.13.rst
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ Improved Modules
array
-----

* Add ``'w'`` type code that can be used for Unicode strings.
* Add ``'w'`` type code (``Py_UCS4``) that can be used for Unicode strings.
It can be used instead of ``'u'`` type code, which is deprecated.
(Contributed by Inada Naoki in :gh:`80480`.)

Expand Down Expand Up @@ -146,11 +146,11 @@ Deprecated
methods of the :class:`wave.Wave_read` and :class:`wave.Wave_write` classes.
They will be removed in Python 3.15.
(Contributed by Victor Stinner in :gh:`105096`.)
* Creating a :class:`typing.NamedTuple` class using keyword arguments to denote
* :mod:`typing`: Creating a :class:`typing.NamedTuple` class using keyword arguments to denote
the fields (``NT = NamedTuple("NT", x=int, y=int)``) is deprecated, and will
be disallowed in Python 3.15. Use the class-based syntax or the functional
syntax instead. (Contributed by Alex Waygood in :gh:`105566`.)
* When using the functional syntax to create a :class:`typing.NamedTuple`
* :mod:`typing`: When using the functional syntax to create a :class:`typing.NamedTuple`
class or a :class:`typing.TypedDict` class, failing to pass a value to the
'fields' parameter (``NT = NamedTuple("NT")`` or ``TD = TypedDict("TD")``) is
deprecated. Passing ``None`` to the 'fields' parameter
Expand All @@ -172,6 +172,297 @@ Deprecated
Replace ``ctypes.SetPointerType(item_type, size)`` with ``item_type * size``.
(Contributed by Victor Stinner in :gh:`105733`.)

Pending Removal in Python 3.14
------------------------------

* :mod:`argparse`: The *type*, *choices*, and *metavar* parameters
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like the practice of putting the module name at the start, and listing them alphabetically, makes it easier to find something.

Let's also alphabetise the main "Deprecated" section. (We could add a hidden comment at the top of the sections saying to add new ones alphabetically - see top of whole file for a hidden .. Rules for maintenance: comment).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please go ahead if you want to make a similar change in other sections :-)

of :class:`!argparse.BooleanOptionalAction` are deprecated
and will be removed in 3.14.
(Contributed by Nikita Sobolev in :gh:`92248`.)

* :mod:`ast`: The following features have been deprecated in documentation
since Python 3.8, now cause a :exc:`DeprecationWarning` to be emitted at
runtime when they are accessed or used, and will be removed in Python 3.14:

* :class:`!ast.Num`
* :class:`!ast.Str`
* :class:`!ast.Bytes`
* :class:`!ast.NameConstant`
* :class:`!ast.Ellipsis`

Use :class:`ast.Constant` instead.
(Contributed by Serhiy Storchaka in :gh:`90953`.)

* :mod:`collections.abc`: Deprecated :class:`~collections.abc.ByteString`.
Prefer :class:`!Sequence` or :class:`~collections.abc.Buffer`.
For use in typing, prefer a union, like ``bytes | bytearray``,
or :class:`collections.abc.Buffer`.
(Contributed by Shantanu Jain in :gh:`91896`.)

* :mod:`email`: Deprecated the *isdst* parameter in :func:`email.utils.localtime`.
(Contributed by Alan Williams in :gh:`72346`.)

* :mod:`importlib`: ``__package__`` and ``__cached__`` will cease to be set or
taken into consideration by the import system (:gh:`97879`).

* :mod:`importlib.abc` deprecated classes:

* :class:`!importlib.abc.ResourceReader`
* :class:`!importlib.abc.Traversable`
* :class:`!importlib.abc.TraversableResources`

Use :mod:`importlib.resources.abc` classes instead:

* :class:`importlib.resources.abc.Traversable`
* :class:`importlib.resources.abc.TraversableResources`

(Contributed by Jason R. Coombs and Hugo van Kemenade in :gh:`93963`.)

* :mod:`itertools` had undocumented, inefficient, historically buggy,
and inconsistent support for copy, deepcopy, and pickle operations.
This will be removed in 3.14 for a significant reduction in code
volume and maintenance burden.
(Contributed by Raymond Hettinger in :gh:`101588`.)

* :mod:`multiprocessing`: The default start method will change to a safer one on
Linux, BSDs, and other non-macOS POSIX platforms where ``'fork'`` is currently
the default (:gh:`84559`). Adding a runtime warning about this was deemed too
disruptive as the majority of code is not expected to care. Use the
:func:`~multiprocessing.get_context` or
:func:`~multiprocessing.set_start_method` APIs to explicitly specify when
your code *requires* ``'fork'``. See :ref:`multiprocessing-start-methods`.

* :mod:`pathlib`: :meth:`~pathlib.PurePath.is_relative_to`,
:meth:`~pathlib.PurePath.relative_to`: passing additional arguments is
deprecated.

* :func:`pkgutil.find_loader` and :func:`pkgutil.get_loader`
now raise :exc:`DeprecationWarning`;
use :func:`importlib.util.find_spec` instead.
(Contributed by Nikita Sobolev in :gh:`97850`.)

* :mod:`pty`:

* ``master_open()``: use :func:`pty.openpty`.
* ``slave_open()``: use :func:`pty.openpty`.

* :func:`shutil.rmtree` *onerror* parameter is deprecated in 3.12,
and will be removed in 3.14: use the *onexc* parameter instead.

* :mod:`sqlite3`:

* :data:`~sqlite3.version` and :data:`~sqlite3.version_info`.

* :meth:`~sqlite3.Cursor.execute` and :meth:`~sqlite3.Cursor.executemany`
if :ref:`named placeholders <sqlite3-placeholders>` are used and
*parameters* is a sequence instead of a :class:`dict`.

* date and datetime adapter, date and timestamp converter:
see the :mod:`sqlite3` documentation for suggested replacement recipes.

* :class:`types.CodeType`: Accessing ``co_lnotab`` was deprecated in :pep:`626`
since 3.10 and was planned to be removed in 3.12,
but it only got a proper :exc:`DeprecationWarning` in 3.12.
May be removed in 3.14.
(Contributed by Nikita Sobolev in :gh:`101866`.)

* :mod:`typing`: :class:`~typing.ByteString`, deprecated since Python 3.9,
now causes a :exc:`DeprecationWarning` to be emitted when it is used.

* :class:`!urllib.parse.Quoter`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Needs some more info.

Was deprecated with "It was not intended to be a public API" in PR #25798 by Greg, issue #88168.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I created PR #106675 to elaborate this entry.


* :mod:`xml.etree.ElementTree`: Testing the truth value of an
:class:`~xml.etree.ElementTree.Element` is deprecated and will raise an
exception in Python 3.14.

Pending Removal in Python 3.15
------------------------------

* :class:`typing.NamedTuple`:

* The undocumented keyword argument syntax for creating NamedTuple classes
(``NT = NamedTuple("NT", x=int)``) is deprecated, and will be disallowed in
3.15. Use the class-based syntax or the functional syntax instead.

* When using the functional syntax to create a NamedTuple class, failing to
pass a value to the 'fields' parameter (``NT = NamedTuple("NT")``) is
deprecated. Passing ``None`` to the 'fields' parameter
(``NT = NamedTuple("NT", None)``) is also deprecated. Both will be
disallowed in Python 3.15. To create a NamedTuple class with 0 fields, use
``class NT(NamedTuple): pass`` or ``NT = NamedTuple("NT", [])``.

* :class:`typing.TypedDict`: When using the functional syntax to create a
TypedDict class, failing to pass a value to the 'fields' parameter (``TD =
TypedDict("TD")``) is deprecated. Passing ``None`` to the 'fields' parameter
(``TD = TypedDict("TD", None)``) is also deprecated. Both will be disallowed
in Python 3.15. To create a TypedDict class with 0 fields, use ``class
TD(TypedDict): pass`` or ``TD = TypedDict("TD", {})``.
Comment on lines +281 to +299
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, these two are listed in the main "Deprecated" section.

Should they be in both or just one?

Looking at older What's New pages, some (but not all) sections have intro texts saying they're were only for deprecations from earlier versions:

  • What’s New In Python 3.11
    • Deprecated
      • "This section lists Python APIs that have been deprecated in Python 3.11."
      • Pending Removal in Python 3.12
        • "The following Python APIs have been deprecated in earlier Python releases, and will be removed in Python 3.12."
  • What’s New In Python 3.12
    • Deprecated
      • [no intro text]
      • Pending Removal in Python 3.13
        • "The following modules and APIs have been deprecated in earlier Python releases, and will be removed in Python 3.13."
      • Pending Removal in Python 3.14
        • [no intro text]
      • Pending Removal in Future Versions
        • "The following APIs were deprecated in earlier Python versions and will be removed, although there is currently no date scheduled for their removal."

re:

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I put the two items in both sections on purpose. We can just copy/paste the Pending Removal section in the future What's New In Python 3.14, and people reading Pending Removal don't have to read the Deprecation section.


* :mod:`wave`: Deprecate the ``getmark()``, ``setmark()`` and ``getmarkers()``
methods of the :class:`wave.Wave_read` and :class:`wave.Wave_write` classes.
They will be removed in Python 3.15.
(Contributed by Victor Stinner in :gh:`105096`.)

Pending Removal in Python 3.16
------------------------------

* :class:`array.array` ``'u'`` type (``wchar_t``):
use the ``'w'`` type instead (``Py_UCS4``).

Pending Removal in Future Versions
----------------------------------

The following APIs were deprecated in earlier Python versions and will be removed,
although there is currently no date scheduled for their removal.

* :mod:`argparse`: Nesting argument groups and nesting mutually exclusive
groups are deprecated.

* :mod:`builtins`:

* ``~bool``, bitwise inversion on bool.
* ``bool(NotImplemented)``.
* 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`.
* Delegation of ``int()`` to ``__trunc__()`` method.

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

* :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`:

* ``load_module()`` method: use ``exec_module()`` instead.
* :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:`importlib.resources`: First parameter to files is renamed to 'anchor'.
* :mod:`importlib.resources` deprecated methods:

* ``contents()``
* ``is_resource()``
* ``open_binary()``
* ``open_text()``
* ``path()``
* ``read_binary()``
* ``read_text()``

Use ``files()`` instead. Refer to `importlib-resources: Migrating from Legacy
<https://importlib-resources.readthedocs.io/en/latest/using.html#migrating-from-legacy>`_
for migration advice.

* :func:`locale.getdefaultlocale`: use :func:`locale.setlocale()`,
:func:`locale.getencoding()` and :func:`locale.getlocale()` instead
(:gh:`90817`)

* :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 multi-threaded process.

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

* :mod:`re`: bad character in group name.

* :mod:`ssl` options and protocols:

* :class:`ssl.SSLContext` without protocol argument is deprecated.
* :class:`ssl.SSLContext`: :meth:`~ssl.SSLContext.set_npn_protocols` and
:meth:`!~ssl.SSLContext.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:`!sre_compile`, :mod:`!sre_constants` and :mod:`!sre_parse` modules.

* ``types.CodeType.co_lnotab``: use the ``co_lines`` attribute instead.

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

* :func:`sysconfig.is_python_build` *check_home* parameter is deprecated and
ignored.

* :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:`unittest.IsolatedAsyncioTestCase`: it is deprecated to return a value
that is not None from a test case.

* :mod:`urllib.request`: :class:`~urllib.request.URLopener` and
:class:`~urllib.request.FancyURLopener` style of invoking requests is
deprecated. Use newer :func:`~urllib.request.urlopen` functions and methods.

* :func:`!urllib.parse.to_bytes`.

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

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

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

* :meth:`zipimport.zipimporter.load_module` is deprecated:
use :meth:`~zipimport.zipimporter.exec_module` instead.


Removed
=======
Expand Down Expand Up @@ -617,6 +908,8 @@ Removed
Pending Removal in Python 3.14
------------------------------

* Creating immutable types (:data:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable
bases using the C API.
* Global configuration variables:

* :c:var:`Py_DebugFlag`: use :c:member:`PyConfig.parser_debug`
Expand Down