From bce1418541a64a793960182772f985f64afbfa1a Mon Sep 17 00:00:00 2001 From: Yurii Karabas <1998uriyyo@gmail.com> Date: Mon, 19 Jul 2021 20:22:12 +0300 Subject: bpo-44524: Add missed __name__ and __qualname__ to typing module objects (#27237) Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> --- Lib/test/test_typing.py | 61 ++++++++++++++++++++++ Lib/typing.py | 9 ++++ .../2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst | 2 + 3 files changed, 72 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index da6775e..b696447 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4498,6 +4498,67 @@ class TypeGuardTests(BaseTestCase): 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): """Tests for __all__.""" diff --git a/Lib/typing.py b/Lib/typing.py index 59f3ca3..4a6efee 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -358,6 +358,12 @@ class _SpecialForm(_Final, _root=True): self._name = getitem.__name__ self.__doc__ = getitem.__doc__ + def __getattr__(self, item): + if item in {'__name__', '__qualname__'}: + return self._name + + raise AttributeError(item) + def __mro_entries__(self, bases): raise TypeError(f"Cannot subclass {self!r}") @@ -935,6 +941,9 @@ class _BaseGenericAlias(_Final, _root=True): return tuple(res) def __getattr__(self, attr): + if attr in {'__name__', '__qualname__'}: + return self._name + # We are careful for copy and pickle. # Also for simplicity we just don't relay all dunder names if '__origin__' in self.__dict__ and not _is_dunder(attr): diff --git a/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst b/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst new file mode 100644 index 0000000..0acdc7d --- /dev/null +++ b/Misc/NEWS.d/next/Library/2021-07-19-14-04-42.bpo-44524.Nbf2JC.rst @@ -0,0 +1,2 @@ +Add missing ``__name__`` and ``__qualname__`` attributes to ``typing`` module +classes. Patch provided by Yurii Karabas. -- cgit v0.12