From 06e9a35169e125488d4ae9228626eb95375f3a14 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Wed, 25 Aug 2021 11:36:47 -0700 Subject: bpo-44524: Don't modify MRO when inheriting from typing.Annotated (GH-27841) (cherry picked from commit 23384a1749359f0ae7aaae052073d44b59e715a1) Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com> --- Lib/test/test_typing.py | 5 +++++ Lib/typing.py | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py index b1cd547..7b2fd69 100644 --- a/Lib/test/test_typing.py +++ b/Lib/test/test_typing.py @@ -4512,6 +4512,11 @@ class AnnotatedTests(BaseTestCase): X = List[Annotated[T, 5]] self.assertEqual(X[int], List[Annotated[int, 5]]) + def test_annotated_mro(self): + class X(Annotated[int, (1, 10)]): ... + self.assertEqual(X.__mro__, (X, int, object), + "Annotated should be transparent.") + class TypeAliasTests(BaseTestCase): def test_canonical_usage_with_variable_annotation(self): diff --git a/Lib/typing.py b/Lib/typing.py index 4935460..423329a 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1573,7 +1573,7 @@ class _AnnotatedAlias(_GenericAlias, _root=True): if isinstance(origin, _AnnotatedAlias): metadata = origin.__metadata__ + metadata origin = origin.__origin__ - super().__init__(origin, origin, name="Annotated") + super().__init__(origin, origin) self.__metadata__ = metadata def copy_with(self, params): @@ -1601,6 +1601,11 @@ class _AnnotatedAlias(_GenericAlias, _root=True): def __hash__(self): return hash((self.__origin__, self.__metadata__)) + def __getattr__(self, attr): + if attr in {'__name__', '__qualname__'}: + return 'Annotated' + return super().__getattr__(attr) + class Annotated: """Add context specific metadata to a type. -- cgit v0.12