mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
bpo-38291: DeprecationWarning when importing typing.{io,re} (#26719)
This commit is contained in:
parent
291848195f
commit
09eb817115
4 changed files with 35 additions and 16 deletions
|
@ -11,8 +11,7 @@ from io import BytesIO, TextIOWrapper
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from types import ModuleType
|
from types import ModuleType
|
||||||
from typing import ContextManager, Iterable, Union
|
from typing import ContextManager, Iterable, Union
|
||||||
from typing import cast
|
from typing import cast, BinaryIO, TextIO
|
||||||
from typing.io import BinaryIO, TextIO
|
|
||||||
from collections.abc import Sequence
|
from collections.abc import Sequence
|
||||||
from functools import singledispatch
|
from functools import singledispatch
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ import collections
|
||||||
import pickle
|
import pickle
|
||||||
import re
|
import re
|
||||||
import sys
|
import sys
|
||||||
|
import warnings
|
||||||
from unittest import TestCase, main, skipUnless, skip
|
from unittest import TestCase, main, skipUnless, skip
|
||||||
from copy import copy, deepcopy
|
from copy import copy, deepcopy
|
||||||
|
|
||||||
|
@ -1976,7 +1977,7 @@ class GenericTests(BaseTestCase):
|
||||||
T = TypeVar('T')
|
T = TypeVar('T')
|
||||||
things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any],
|
things = [Any, Union[T, int], Callable[..., T], Tuple[Any, Any],
|
||||||
Optional[List[int]], typing.Mapping[int, str],
|
Optional[List[int]], typing.Mapping[int, str],
|
||||||
typing.re.Match[bytes], typing.Iterable['whatever']]
|
typing.Match[bytes], typing.Iterable['whatever']]
|
||||||
for t in things:
|
for t in things:
|
||||||
self.assertEqual(weakref.ref(t)(), t)
|
self.assertEqual(weakref.ref(t)(), t)
|
||||||
|
|
||||||
|
@ -3996,12 +3997,14 @@ class IOTests(BaseTestCase):
|
||||||
self.assertEqual(a.__parameters__, ())
|
self.assertEqual(a.__parameters__, ())
|
||||||
|
|
||||||
def test_io_submodule(self):
|
def test_io_submodule(self):
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
from typing.io import IO, TextIO, BinaryIO, __all__, __name__
|
from typing.io import IO, TextIO, BinaryIO, __all__, __name__
|
||||||
self.assertIs(IO, typing.IO)
|
self.assertIs(IO, typing.IO)
|
||||||
self.assertIs(TextIO, typing.TextIO)
|
self.assertIs(TextIO, typing.TextIO)
|
||||||
self.assertIs(BinaryIO, typing.BinaryIO)
|
self.assertIs(BinaryIO, typing.BinaryIO)
|
||||||
self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
|
self.assertEqual(set(__all__), set(['IO', 'TextIO', 'BinaryIO']))
|
||||||
self.assertEqual(__name__, 'typing.io')
|
self.assertEqual(__name__, 'typing.io')
|
||||||
|
self.assertEqual(len(w), 1)
|
||||||
|
|
||||||
|
|
||||||
class RETests(BaseTestCase):
|
class RETests(BaseTestCase):
|
||||||
|
@ -4048,11 +4051,13 @@ class RETests(BaseTestCase):
|
||||||
self.assertEqual(repr(Match[bytes]), 'typing.Match[bytes]')
|
self.assertEqual(repr(Match[bytes]), 'typing.Match[bytes]')
|
||||||
|
|
||||||
def test_re_submodule(self):
|
def test_re_submodule(self):
|
||||||
|
with warnings.catch_warnings(record=True) as w:
|
||||||
from typing.re import Match, Pattern, __all__, __name__
|
from typing.re import Match, Pattern, __all__, __name__
|
||||||
self.assertIs(Match, typing.Match)
|
self.assertIs(Match, typing.Match)
|
||||||
self.assertIs(Pattern, typing.Pattern)
|
self.assertIs(Pattern, typing.Pattern)
|
||||||
self.assertEqual(set(__all__), set(['Match', 'Pattern']))
|
self.assertEqual(set(__all__), set(['Match', 'Pattern']))
|
||||||
self.assertEqual(__name__, 'typing.re')
|
self.assertEqual(__name__, 'typing.re')
|
||||||
|
self.assertEqual(len(w), 1)
|
||||||
|
|
||||||
def test_cannot_subclass(self):
|
def test_cannot_subclass(self):
|
||||||
with self.assertRaises(TypeError) as ex:
|
with self.assertRaises(TypeError) as ex:
|
||||||
|
|
|
@ -28,6 +28,7 @@ import operator
|
||||||
import re as stdlib_re # Avoid confusion with the re we export.
|
import re as stdlib_re # Avoid confusion with the re we export.
|
||||||
import sys
|
import sys
|
||||||
import types
|
import types
|
||||||
|
import warnings
|
||||||
from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
|
from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
|
||||||
|
|
||||||
# Please keep __all__ alphabetized within each category.
|
# Please keep __all__ alphabetized within each category.
|
||||||
|
@ -2512,7 +2513,20 @@ class TextIO(IO[str]):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class io:
|
class _DeprecatedType(type):
|
||||||
|
def __getattribute__(cls, name):
|
||||||
|
if name != "__dict__" 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."""
|
"""Wrapper namespace for IO generic classes."""
|
||||||
|
|
||||||
__all__ = ['IO', 'TextIO', 'BinaryIO']
|
__all__ = ['IO', 'TextIO', 'BinaryIO']
|
||||||
|
@ -2527,7 +2541,7 @@ sys.modules[io.__name__] = io
|
||||||
Pattern = _alias(stdlib_re.Pattern, 1)
|
Pattern = _alias(stdlib_re.Pattern, 1)
|
||||||
Match = _alias(stdlib_re.Match, 1)
|
Match = _alias(stdlib_re.Match, 1)
|
||||||
|
|
||||||
class re:
|
class re(metaclass=_DeprecatedType):
|
||||||
"""Wrapper namespace for re type aliases."""
|
"""Wrapper namespace for re type aliases."""
|
||||||
|
|
||||||
__all__ = ['Pattern', 'Match']
|
__all__ = ['Pattern', 'Match']
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Importing typing.io or typing.re now prints a `DeprecationWarning`.
|
Loading…
Add table
Add a link
Reference in a new issue