gh-91896: Revert some very noisy DeprecationWarnings for ByteString (#104424)

This commit is contained in:
Alex Waygood 2023-05-13 09:55:35 +01:00 committed by GitHub
parent 1be80ed107
commit c527eb1c2a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 19 additions and 79 deletions

View file

@ -14,10 +14,7 @@
.. testsetup:: * .. testsetup:: *
import warnings from collections.abc import *
# Ignore warning when ByteString is imported
with warnings.catch_warnings(action='ignore', category=DeprecationWarning):
from collections.abc import *
import itertools import itertools
__name__ = '<doctest>' __name__ = '<doctest>'

View file

@ -831,8 +831,8 @@ Pending Removal in Python 3.14
For use in typing, prefer a union, like ``bytes | bytearray``, 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`.) (Contributed by Shantanu Jain in :gh:`91896`.)
* :class:`typing.ByteString`, deprecated since Python 3.9, now causes an * :class:`typing.ByteString`, deprecated since Python 3.9, now causes a
:exc:`DeprecationWarning` to be emitted when it is used or accessed. :exc:`DeprecationWarning` to be emitted when it is used.
* Creating immutable types (:data:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable * Creating immutable types (:data:`Py_TPFLAGS_IMMUTABLETYPE`) with mutable
bases using the C API. bases using the C API.

View file

@ -1,12 +1,3 @@
from _collections_abc import * from _collections_abc import *
from _collections_abc import __all__ from _collections_abc import __all__
from _collections_abc import _CallableGenericAlias from _collections_abc import _CallableGenericAlias
_deprecated_ByteString = globals().pop("ByteString")
def __getattr__(attr):
if attr == "ByteString":
import warnings
warnings._deprecated("collections.abc.ByteString", remove=(3, 14))
return _deprecated_ByteString
raise AttributeError(f"module 'collections.abc' has no attribute {attr!r}")

View file

@ -48,13 +48,11 @@ def dash_R(ns, test_name, test_func):
else: else:
zdc = zipimport._zip_directory_cache.copy() zdc = zipimport._zip_directory_cache.copy()
abcs = {} abcs = {}
# catch and ignore collections.abc.ByteString deprecation for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]:
with warnings.catch_warnings(action='ignore', category=DeprecationWarning): if not isabstract(abc):
for abc in [getattr(collections.abc, a) for a in collections.abc.__all__]: continue
if not isabstract(abc): for obj in abc.__subclasses__() + [abc]:
continue abcs[obj] = _get_dump(obj)[0]
for obj in abc.__subclasses__() + [abc]:
abcs[obj] = _get_dump(obj)[0]
# bpo-31217: Integer pool to get a single integer object for the same # bpo-31217: Integer pool to get a single integer object for the same
# value. The pool is used to prevent false alarm when checking for memory # value. The pool is used to prevent false alarm when checking for memory
@ -176,8 +174,7 @@ def dash_R_cleanup(fs, ps, pic, zdc, abcs):
# Clear ABC registries, restoring previously saved ABC registries. # Clear ABC registries, restoring previously saved ABC registries.
# ignore deprecation warning for collections.abc.ByteString # ignore deprecation warning for collections.abc.ByteString
with warnings.catch_warnings(action='ignore', category=DeprecationWarning): abs_classes = [getattr(collections.abc, a) for a in collections.abc.__all__]
abs_classes = [getattr(collections.abc, a) for a in collections.abc.__all__]
abs_classes = filter(isabstract, abs_classes) abs_classes = filter(isabstract, abs_classes)
for abc in abs_classes: for abc in abs_classes:
for obj in abc.__subclasses__() + [abc]: for obj in abc.__subclasses__() + [abc]:

View file

@ -11,7 +11,6 @@ from itertools import product, chain, combinations
import string import string
import sys import sys
from test import support from test import support
from test.support.import_helper import import_fresh_module
import types import types
import unittest import unittest
@ -26,7 +25,7 @@ from collections.abc import Sized, Container, Callable, Collection
from collections.abc import Set, MutableSet from collections.abc import Set, MutableSet
from collections.abc import Mapping, MutableMapping, KeysView, ItemsView, ValuesView from collections.abc import Mapping, MutableMapping, KeysView, ItemsView, ValuesView
from collections.abc import Sequence, MutableSequence from collections.abc import Sequence, MutableSequence
from collections.abc import Buffer from collections.abc import ByteString, Buffer
class TestUserObjects(unittest.TestCase): class TestUserObjects(unittest.TestCase):
@ -1940,8 +1939,6 @@ class TestCollectionABCs(ABCTestCase):
nativeseq, seqseq, (letter, start, stop)) nativeseq, seqseq, (letter, start, stop))
def test_ByteString(self): def test_ByteString(self):
with self.assertWarns(DeprecationWarning):
from collections.abc import ByteString
for sample in [bytes, bytearray]: for sample in [bytes, bytearray]:
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
self.assertIsInstance(sample(), ByteString) self.assertIsInstance(sample(), ByteString)
@ -1963,11 +1960,6 @@ class TestCollectionABCs(ABCTestCase):
# No metaclass conflict # No metaclass conflict
class Z(ByteString, Awaitable): pass class Z(ByteString, Awaitable): pass
def test_ByteString_attribute_access(self):
collections_abc = import_fresh_module("collections.abc")
with self.assertWarns(DeprecationWarning):
collections_abc.ByteString
def test_Buffer(self): def test_Buffer(self):
for sample in [bytes, bytearray, memoryview]: for sample in [bytes, bytearray, memoryview]:
self.assertIsInstance(sample(b"x"), Buffer) self.assertIsInstance(sample(b"x"), Buffer)

View file

@ -8,7 +8,6 @@ import pickle
import re import re
import sys import sys
import warnings import warnings
from test.support.import_helper import import_fresh_module
from unittest import TestCase, main, skipUnless, skip from unittest import TestCase, main, skipUnless, skip
from unittest.mock import patch from unittest.mock import patch
from copy import copy, deepcopy from copy import copy, deepcopy
@ -3909,14 +3908,7 @@ class GenericTests(BaseTestCase):
self.assertEqual(MyChain[int]().__orig_class__, MyChain[int]) self.assertEqual(MyChain[int]().__orig_class__, MyChain[int])
def test_all_repr_eq_any(self): def test_all_repr_eq_any(self):
typing = import_fresh_module("typing") objs = (getattr(typing, el) for el in typing.__all__)
with warnings.catch_warnings(record=True) as wlog:
warnings.filterwarnings('always', '', DeprecationWarning)
objs = [getattr(typing, el) for el in typing.__all__]
self.assertEqual(
[str(w.message) for w in wlog],
["'typing.ByteString' is deprecated and slated for removal in Python 3.14"]
)
for obj in objs: for obj in objs:
self.assertNotEqual(repr(obj), '') self.assertNotEqual(repr(obj), '')
self.assertEqual(obj, obj) self.assertEqual(obj, obj)
@ -6005,15 +5997,13 @@ class CollectionsAbcTests(BaseTestCase):
def test_bytestring(self): def test_bytestring(self):
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
from typing import ByteString self.assertIsInstance(b'', typing.ByteString)
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
self.assertIsInstance(b'', ByteString) self.assertIsInstance(bytearray(b''), typing.ByteString)
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
self.assertIsInstance(bytearray(b''), ByteString) class Foo(typing.ByteString): ...
with self.assertWarns(DeprecationWarning): with self.assertWarns(DeprecationWarning):
class Foo(ByteString): ... class Bar(typing.ByteString, typing.Awaitable): ...
with self.assertWarns(DeprecationWarning):
class Bar(ByteString, typing.Awaitable): ...
def test_list(self): def test_list(self):
self.assertIsSubclass(list, typing.List) self.assertIsSubclass(list, typing.List)
@ -8309,10 +8299,6 @@ SpecialAttrsT = typing.TypeVar('SpecialAttrsT', int, float, complex)
class SpecialAttrsTests(BaseTestCase): class SpecialAttrsTests(BaseTestCase):
def test_special_attrs(self): def test_special_attrs(self):
with warnings.catch_warnings(
action='ignore', category=DeprecationWarning
):
typing_ByteString = typing.ByteString
cls_to_check = { cls_to_check = {
# ABC classes # ABC classes
typing.AbstractSet: 'AbstractSet', typing.AbstractSet: 'AbstractSet',
@ -8321,7 +8307,7 @@ class SpecialAttrsTests(BaseTestCase):
typing.AsyncIterable: 'AsyncIterable', typing.AsyncIterable: 'AsyncIterable',
typing.AsyncIterator: 'AsyncIterator', typing.AsyncIterator: 'AsyncIterator',
typing.Awaitable: 'Awaitable', typing.Awaitable: 'Awaitable',
typing_ByteString: 'ByteString', typing.ByteString: 'ByteString',
typing.Callable: 'Callable', typing.Callable: 'Callable',
typing.ChainMap: 'ChainMap', typing.ChainMap: 'ChainMap',
typing.Collection: 'Collection', typing.Collection: 'Collection',
@ -8646,8 +8632,6 @@ class AllTests(BaseTestCase):
getattr(v, '__module__', None) == typing.__name__ getattr(v, '__module__', None) == typing.__name__
) )
} }
# Deprecated; added dynamically via module __getattr__
computed_all.add("ByteString")
self.assertSetEqual(computed_all, actual_all) self.assertSetEqual(computed_all, actual_all)

View file

@ -2772,6 +2772,9 @@ Mapping = _alias(collections.abc.Mapping, 2)
MutableMapping = _alias(collections.abc.MutableMapping, 2) MutableMapping = _alias(collections.abc.MutableMapping, 2)
Sequence = _alias(collections.abc.Sequence, 1) Sequence = _alias(collections.abc.Sequence, 1)
MutableSequence = _alias(collections.abc.MutableSequence, 1) MutableSequence = _alias(collections.abc.MutableSequence, 1)
ByteString = _DeprecatedGenericAlias(
collections.abc.ByteString, 0, removal_version=(3, 14) # Not generic.
)
# Tuple accepts variable number of parameters. # Tuple accepts variable number of parameters.
Tuple = _TupleType(tuple, -1, inst=False, name='Tuple') Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
Tuple.__doc__ = \ Tuple.__doc__ = \
@ -3571,27 +3574,3 @@ def override(method: F, /) -> F:
# read-only property, TypeError if it's a builtin class. # read-only property, TypeError if it's a builtin class.
pass pass
return method return method
def __getattr__(attr):
if attr == "ByteString":
import warnings
warnings._deprecated("typing.ByteString", remove=(3, 14))
with warnings.catch_warnings(
action="ignore", category=DeprecationWarning
):
# Not generic
ByteString = globals()["ByteString"] = _DeprecatedGenericAlias(
collections.abc.ByteString, 0, removal_version=(3, 14)
)
return ByteString
raise AttributeError(f"module 'typing' has no attribute {attr!r}")
def _remove_cached_ByteString_from_globals():
try:
del globals()["ByteString"]
except KeyError:
pass
_cleanups.append(_remove_cached_ByteString_from_globals)