]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-99535: Add test for inheritance of annotations and update documentation (#99990)
authorMonadChains <monadchains@gmail.com>
Sat, 24 Dec 2022 20:07:14 +0000 (21:07 +0100)
committerGitHub <noreply@github.com>
Sat, 24 Dec 2022 20:07:14 +0000 (12:07 -0800)
Doc/howto/annotations.rst
Doc/library/typing.rst
Lib/test/test_grammar.py

index 2bc2f2d4c839e2df8d7ae31e4dc95c0923f6e3cd..472069032d6509c432892613d8b405d150ed6866 100644 (file)
@@ -57,6 +57,12 @@ Accessing The Annotations Dict Of An Object In Python 3.10 And Newer
   newer is to call :func:`getattr` with three arguments,
   for example ``getattr(o, '__annotations__', None)``.
 
+  Before Python 3.10, accessing ``__annotations__`` on a class that
+  defines no annotations but that has a parent class with
+  annotations would return the parent's ``__annotations__``.
+  In Python 3.10 and newer, the child class's annotations
+  will be an empty dict instead.
+
 
 Accessing The Annotations Dict Of An Object In Python 3.9 And Older
 ===================================================================
index 356f919a1897b29719d127b5288e96c138a3a6ff..4eed6b4ea88741e47a531c5731b34a72a190c3b5 100644 (file)
@@ -2777,6 +2777,10 @@ Introspection helpers
    .. versionchanged:: 3.9
       Added ``include_extras`` parameter as part of :pep:`593`.
 
+   .. versionchanged:: 3.10
+      Calling ``get_type_hints()`` on a class no longer returns the annotations
+      of its base classes.
+
    .. versionchanged:: 3.11
       Previously, ``Optional[t]`` was added for function and method annotations
       if a default value equal to ``None`` was set.
index 58f907eac09d53e7c2ffcb336223675c7924c8a6..5b946020994e31ec3af68597a1d9d544d55cc7bf 100644 (file)
@@ -415,6 +415,28 @@ class GrammarTests(unittest.TestCase):
                 x: int
                 x.y: list = []
 
+    def test_annotations_inheritance(self):
+        # Check that annotations are not inherited by derived classes
+        class A:
+            attr: int
+        class B(A):
+            pass
+        class C(A):
+            attr: str
+        class D:
+            attr2: int
+        class E(A, D):
+            pass
+        class F(C, A):
+            pass
+        self.assertEqual(A.__annotations__, {"attr": int})
+        self.assertEqual(B.__annotations__, {})
+        self.assertEqual(C.__annotations__, {"attr" : str})
+        self.assertEqual(D.__annotations__, {"attr2" : int})
+        self.assertEqual(E.__annotations__, {})
+        self.assertEqual(F.__annotations__, {})
+
+
     def test_var_annot_metaclass_semantics(self):
         class CMeta(type):
             @classmethod