]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-44524: Don't modify MRO when inheriting from typing.Annotated (GH-27841)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 25 Aug 2021 18:36:47 +0000 (11:36 -0700)
committerGitHub <noreply@github.com>
Wed, 25 Aug 2021 18:36:47 +0000 (11:36 -0700)
(cherry picked from commit 23384a1749359f0ae7aaae052073d44b59e715a1)

Co-authored-by: Ken Jin <28750310+Fidget-Spinner@users.noreply.github.com>
Lib/test/test_typing.py
Lib/typing.py

index b1cd54712563397d2a7b9539f68b373a5184c335..7b2fd6980899383041a794ebc21c11bf4e46a195 100644 (file)
@@ -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):
index 493546045a2bd81db41fd6945e78c13f1731527f..423329a98005c85f7f9278f042c1afa7cf317a0b 100644 (file)
@@ -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.