[Python-checkins] gh-92871: Remove typing.{io, re} namespaces (#92873)

JelleZijlstra webhook-mailer at python.org
Tue May 23 09:44:50 EDT 2023


https://github.com/python/cpython/commit/abdda5b13388aa21923f6ce104242adff518d430
commit: abdda5b13388aa21923f6ce104242adff518d430
branch: main
author: Sebastian Rittau <srittau at rittau.biz>
committer: JelleZijlstra <jelle.zijlstra at gmail.com>
date: 2023-05-23T13:44:26Z
summary:

gh-92871: Remove typing.{io,re} namespaces (#92873)

Closes #92871

Co-authored-by: Alex Waygood <Alex.Waygood at Gmail.com>
Co-authored-by: Jelle Zijlstra <jelle.zijlstra at gmail.com>

files:
A Misc/NEWS.d/next/Library/2022-05-17-10-46-44.gh-issue-92871.GVogrT.rst
M Doc/library/typing.rst
M Doc/whatsnew/3.13.rst
M Lib/test/test_typing.py
M Lib/typing.py

diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index c90cb411acde..92943c46ef51 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -2074,10 +2074,6 @@ Other concrete types
    represent the types of I/O streams such as returned by
    :func:`open`.
 
-   .. deprecated-removed:: 3.8 3.13
-      The ``typing.io`` namespace is deprecated and will be removed.
-      These types should be directly imported from ``typing`` instead.
-
 .. class:: Pattern
            Match
 
@@ -2088,10 +2084,6 @@ Other concrete types
    ``Pattern[str]``, ``Pattern[bytes]``, ``Match[str]``, or
    ``Match[bytes]``.
 
-   .. deprecated-removed:: 3.8 3.13
-      The ``typing.re`` namespace is deprecated and will be removed.
-      These types should be directly imported from ``typing`` instead.
-
    .. deprecated:: 3.9
       Classes ``Pattern`` and ``Match`` from :mod:`re` now support ``[]``.
       See :pep:`585` and :ref:`types-genericalias`.
@@ -2981,9 +2973,6 @@ convenience. This is subject to change, and not all deprecations are listed.
 +----------------------------------+---------------+-------------------+----------------+
 |  Feature                         | Deprecated in | Projected removal | PEP/issue      |
 +==================================+===============+===================+================+
-|  ``typing.io`` and ``typing.re`` | 3.8           | 3.13              | :issue:`38291` |
-|  submodules                      |               |                   |                |
-+----------------------------------+---------------+-------------------+----------------+
 |  ``typing`` versions of standard | 3.9           | Undecided         | :pep:`585`     |
 |  collections                     |               |                   |                |
 +----------------------------------+---------------+-------------------+----------------+
diff --git a/Doc/whatsnew/3.13.rst b/Doc/whatsnew/3.13.rst
index 8256f429183a..602a865b5930 100644
--- a/Doc/whatsnew/3.13.rst
+++ b/Doc/whatsnew/3.13.rst
@@ -107,6 +107,9 @@ Removed
   `Exscript <https://pypi.org/project/Exscript/>`_ instead.
   (Contributed by Victor Stinner in :gh:`104773`.)
 
+* Namespaces ``typing.io`` and ``typing.re``, deprecated in Python 3.8,
+  are now removed. The items in those namespaces can be imported directly
+  from :mod:`typing`. (Contributed by Sebastian Rittau in :gh:`92871`.)
 
 Porting to Python 3.13
 ======================
diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index 9a3e64289ee8..b4a5a68a2f7e 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -7529,17 +7529,6 @@ def stuff(a: BinaryIO) -> bytes:
         a = stuff.__annotations__['a']
         self.assertEqual(a.__parameters__, ())
 
-    def test_io_submodule(self):
-        with warnings.catch_warnings(record=True) as w:
-            warnings.filterwarnings("default", category=DeprecationWarning)
-            from typing.io import IO, TextIO, BinaryIO, __all__, __name__
-            self.assertIs(IO, typing.IO)
-            self.assertIs(TextIO, typing.TextIO)
-            self.assertIs(BinaryIO, typing.BinaryIO)
-            self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
-            self.assertEqual(__name__, 'typing.io')
-            self.assertEqual(len(w), 1)
-
 
 class RETests(BaseTestCase):
     # Much of this is really testing _TypeAlias.
@@ -7584,16 +7573,6 @@ def test_repr(self):
         self.assertEqual(repr(Match[str]), 'typing.Match[str]')
         self.assertEqual(repr(Match[bytes]), 'typing.Match[bytes]')
 
-    def test_re_submodule(self):
-        with warnings.catch_warnings(record=True) as w:
-            warnings.filterwarnings("default", category=DeprecationWarning)
-            from typing.re import Match, Pattern, __all__, __name__
-            self.assertIs(Match, typing.Match)
-            self.assertIs(Pattern, typing.Pattern)
-            self.assertEqual(set(__all__), set(['Match', 'Pattern']))
-            self.assertEqual(__name__, 'typing.re')
-            self.assertEqual(len(w), 1)
-
     def test_cannot_subclass(self):
         with self.assertRaisesRegex(
             TypeError,
@@ -8765,7 +8744,7 @@ def test_all(self):
         # Context managers.
         self.assertIn('ContextManager', a)
         self.assertIn('AsyncContextManager', a)
-        # Check that io and re are not exported.
+        # Check that former namespaces io and re are not exported.
         self.assertNotIn('io', a)
         self.assertNotIn('re', a)
         # Spot-check that stdlib modules aren't exported.
@@ -8785,7 +8764,6 @@ def test_all_exported_names(self):
             if k in actual_all or (
                 # avoid private names
                 not k.startswith('_') and
-                k not in {'io', 're'} and
                 # there's a few types and metaclasses that aren't exported
                 not k.endswith(('Meta', '_contra', '_co')) and
                 not k.upper() == k and
diff --git a/Lib/typing.py b/Lib/typing.py
index 96393d6a0281..95dbc0b85bcd 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -16,7 +16,6 @@
   no_type_check_decorator.
 * Generic aliases for collections.abc ABCs and few additional protocols.
 * Special types: NewType, NamedTuple, TypedDict.
-* Wrapper submodules for re and io related types.
 """
 
 from abc import abstractmethod, ABCMeta
@@ -27,7 +26,7 @@
 import contextlib
 import functools
 import operator
-import re as stdlib_re  # Avoid confusion with the re we export.
+import re as stdlib_re  # Avoid confusion with the typing.re namespace on <=3.11
 import sys
 import types
 import warnings
@@ -158,10 +157,6 @@
     'Unpack',
 ]
 
-# The pseudo-submodules 're' and 'io' are part of the public
-# namespace, but excluded from __all__ because they might stomp on
-# legitimate imports of those modules.
-
 
 def _type_convert(arg, module=None, *, allow_special_forms=False):
     """For converting None to type(None), and strings to ForwardRef."""
@@ -3150,45 +3145,9 @@ def __enter__(self) -> 'TextIO':
         pass
 
 
-class _DeprecatedType(type):
-    def __getattribute__(cls, name):
-        if name not in ("__dict__", "__module__") and name in cls.__dict__:
-            warnings.warn(
-                f"{cls.__name__} is deprecated, import directly "
-                f"from typing instead. {cls.__name__} will be removed "
-                "in Python 3.12.",
-                DeprecationWarning,
-                stacklevel=2,
-            )
-        return super().__getattribute__(name)
-
-
-class io(metaclass=_DeprecatedType):
-    """Wrapper namespace for IO generic classes."""
-
-    __all__ = ['IO', 'TextIO', 'BinaryIO']
-    IO = IO
-    TextIO = TextIO
-    BinaryIO = BinaryIO
-
-
-io.__name__ = __name__ + '.io'
-sys.modules[io.__name__] = io
-
 Pattern = _alias(stdlib_re.Pattern, 1)
 Match = _alias(stdlib_re.Match, 1)
 
-class re(metaclass=_DeprecatedType):
-    """Wrapper namespace for re type aliases."""
-
-    __all__ = ['Pattern', 'Match']
-    Pattern = Pattern
-    Match = Match
-
-
-re.__name__ = __name__ + '.re'
-sys.modules[re.__name__] = re
-
 
 def reveal_type[T](obj: T, /) -> T:
     """Reveal the inferred type of a variable.
diff --git a/Misc/NEWS.d/next/Library/2022-05-17-10-46-44.gh-issue-92871.GVogrT.rst b/Misc/NEWS.d/next/Library/2022-05-17-10-46-44.gh-issue-92871.GVogrT.rst
new file mode 100644
index 000000000000..992f8afadbe9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-05-17-10-46-44.gh-issue-92871.GVogrT.rst
@@ -0,0 +1,2 @@
+Remove the ``typing.io`` and ``typing.re`` namespaces, deprecated since Python
+3.8. All items are still available from the main :mod:`typing` module.



More information about the Python-checkins mailing list