mirror of
https://github.com/python/cpython
synced 2024-09-16 00:37:36 +00:00
bpo-44524: Add missed __name__ and __qualname__ to typing module objects (#27237)
Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
This commit is contained in:
parent
89f4c34797
commit
bce1418541
|
@ -4498,6 +4498,67 @@ def test_no_isinstance(self):
|
||||||
issubclass(int, TypeGuard)
|
issubclass(int, TypeGuard)
|
||||||
|
|
||||||
|
|
||||||
|
class SpecialAttrsTests(BaseTestCase):
|
||||||
|
def test_special_attrs(self):
|
||||||
|
cls_to_check = (
|
||||||
|
# ABC classes
|
||||||
|
typing.AbstractSet,
|
||||||
|
typing.AsyncContextManager,
|
||||||
|
typing.AsyncGenerator,
|
||||||
|
typing.AsyncIterable,
|
||||||
|
typing.AsyncIterator,
|
||||||
|
typing.Awaitable,
|
||||||
|
typing.ByteString,
|
||||||
|
typing.Callable,
|
||||||
|
typing.ChainMap,
|
||||||
|
typing.Collection,
|
||||||
|
typing.Container,
|
||||||
|
typing.ContextManager,
|
||||||
|
typing.Coroutine,
|
||||||
|
typing.Counter,
|
||||||
|
typing.DefaultDict,
|
||||||
|
typing.Deque,
|
||||||
|
typing.Dict,
|
||||||
|
typing.FrozenSet,
|
||||||
|
typing.Generator,
|
||||||
|
typing.Hashable,
|
||||||
|
typing.ItemsView,
|
||||||
|
typing.Iterable,
|
||||||
|
typing.Iterator,
|
||||||
|
typing.KeysView,
|
||||||
|
typing.List,
|
||||||
|
typing.Mapping,
|
||||||
|
typing.MappingView,
|
||||||
|
typing.MutableMapping,
|
||||||
|
typing.MutableSequence,
|
||||||
|
typing.MutableSet,
|
||||||
|
typing.OrderedDict,
|
||||||
|
typing.Reversible,
|
||||||
|
typing.Sequence,
|
||||||
|
typing.Set,
|
||||||
|
typing.Sized,
|
||||||
|
typing.Tuple,
|
||||||
|
typing.Type,
|
||||||
|
typing.ValuesView,
|
||||||
|
# Special Forms
|
||||||
|
typing.Any,
|
||||||
|
typing.NoReturn,
|
||||||
|
typing.ClassVar,
|
||||||
|
typing.Final,
|
||||||
|
typing.Union,
|
||||||
|
typing.Optional,
|
||||||
|
typing.Literal,
|
||||||
|
typing.TypeAlias,
|
||||||
|
typing.Concatenate,
|
||||||
|
typing.TypeGuard,
|
||||||
|
)
|
||||||
|
|
||||||
|
for cls in cls_to_check:
|
||||||
|
with self.subTest(cls=cls):
|
||||||
|
self.assertEqual(cls.__name__, cls._name)
|
||||||
|
self.assertEqual(cls.__qualname__, cls._name)
|
||||||
|
self.assertEqual(cls.__module__, 'typing')
|
||||||
|
|
||||||
class AllTests(BaseTestCase):
|
class AllTests(BaseTestCase):
|
||||||
"""Tests for __all__."""
|
"""Tests for __all__."""
|
||||||
|
|
||||||
|
|
|
@ -358,6 +358,12 @@ def __init__(self, getitem):
|
||||||
self._name = getitem.__name__
|
self._name = getitem.__name__
|
||||||
self.__doc__ = getitem.__doc__
|
self.__doc__ = getitem.__doc__
|
||||||
|
|
||||||
|
def __getattr__(self, item):
|
||||||
|
if item in {'__name__', '__qualname__'}:
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
raise AttributeError(item)
|
||||||
|
|
||||||
def __mro_entries__(self, bases):
|
def __mro_entries__(self, bases):
|
||||||
raise TypeError(f"Cannot subclass {self!r}")
|
raise TypeError(f"Cannot subclass {self!r}")
|
||||||
|
|
||||||
|
@ -935,6 +941,9 @@ def __mro_entries__(self, bases):
|
||||||
return tuple(res)
|
return tuple(res)
|
||||||
|
|
||||||
def __getattr__(self, attr):
|
def __getattr__(self, attr):
|
||||||
|
if attr in {'__name__', '__qualname__'}:
|
||||||
|
return self._name
|
||||||
|
|
||||||
# We are careful for copy and pickle.
|
# We are careful for copy and pickle.
|
||||||
# Also for simplicity we just don't relay all dunder names
|
# Also for simplicity we just don't relay all dunder names
|
||||||
if '__origin__' in self.__dict__ and not _is_dunder(attr):
|
if '__origin__' in self.__dict__ and not _is_dunder(attr):
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Add missing ``__name__`` and ``__qualname__`` attributes to ``typing`` module
|
||||||
|
classes. Patch provided by Yurii Karabas.
|
Loading…
Reference in a new issue