[Python-checkins] [3.10] gh-99535: Add test for inheritance of annotations and update documentation (GH-99990) (#100509)

JelleZijlstra webhook-mailer at python.org
Mon Dec 26 23:44:59 EST 2022


https://github.com/python/cpython/commit/1ffc67265f1a622751069997e7ca8193f983e1e2
commit: 1ffc67265f1a622751069997e7ca8193f983e1e2
branch: 3.10
author: Jelle Zijlstra <jelle.zijlstra at gmail.com>
committer: JelleZijlstra <jelle.zijlstra at gmail.com>
date: 2022-12-26T20:44:53-08:00
summary:

[3.10] gh-99535: Add test for inheritance of annotations and update documentation (GH-99990) (#100509)

(cherry picked from commit f5b7b19bf10724d831285fb04e00f763838bd555)

Co-authored-by: MonadChains <monadchains at gmail.com>

files:
M Doc/howto/annotations.rst
M Doc/library/typing.rst
M Lib/test/test_grammar.py

diff --git a/Doc/howto/annotations.rst b/Doc/howto/annotations.rst
index 2bc2f2d4c839..472069032d65 100644
--- a/Doc/howto/annotations.rst
+++ b/Doc/howto/annotations.rst
@@ -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
 ===================================================================
diff --git a/Doc/library/typing.rst b/Doc/library/typing.rst
index d415f149027f..d3275209e938 100644
--- a/Doc/library/typing.rst
+++ b/Doc/library/typing.rst
@@ -2233,6 +2233,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.
+
 .. function:: get_args(tp)
 .. function:: get_origin(tp)
 
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 2b9f7df0bd25..27b14ab836b6 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -406,6 +406,28 @@ class Cbad2(C):
                 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



More information about the Python-checkins mailing list