@@ -4402,6 +4402,38 @@ class Cat(Animal):
44024402 'voice' : str ,
44034403 }
44044404
4405+ def test_inheritance_pep563 (self ):
4406+ def _make_td (future , class_name , annos , base , extra_names = None ):
4407+ lines = []
4408+ if future :
4409+ lines .append ('from __future__ import annotations' )
4410+ lines .append ('from typing import TypedDict' )
4411+ lines .append (f'class { class_name } ({ base } ):' )
4412+ for name , anno in annos .items ():
4413+ lines .append (f' { name } : { anno } ' )
4414+ code = '\n ' .join (lines )
4415+ ns = {** extra_names } if extra_names else {}
4416+ exec (code , ns )
4417+ return ns [class_name ]
4418+
4419+ for base_future in (True , False ):
4420+ for child_future in (True , False ):
4421+ with self .subTest (base_future = base_future , child_future = child_future ):
4422+ base = _make_td (
4423+ base_future , "Base" , {"base" : "int" }, "TypedDict"
4424+ )
4425+ if sys .version_info >= (3 , 14 ):
4426+ self .assertIsNotNone (base .__annotate__ )
4427+ child = _make_td (
4428+ child_future , "Child" , {"child" : "int" }, "Base" , {"Base" : base }
4429+ )
4430+ base_anno = typing .ForwardRef ("int" , module = "builtins" ) if base_future else int
4431+ child_anno = typing .ForwardRef ("int" , module = "builtins" ) if child_future else int
4432+ self .assertEqual (base .__annotations__ , {'base' : base_anno })
4433+ self .assertEqual (
4434+ child .__annotations__ , {'child' : child_anno , 'base' : base_anno }
4435+ )
4436+
44054437 def test_required_notrequired_keys (self ):
44064438 self .assertEqual (NontotalMovie .__required_keys__ ,
44074439 frozenset ({"title" }))
@@ -7014,6 +7046,7 @@ class Group(NamedTuple):
70147046 self .assertIs (type (a ), Group )
70157047 self .assertEqual (a , (1 , [2 ]))
70167048
7049+ @skipUnless (sys .version_info <= (3 , 15 ), "Behavior removed in 3.15" )
70177050 def test_namedtuple_keyword_usage (self ):
70187051 with self .assertWarnsRegex (
70197052 DeprecationWarning ,
@@ -7049,6 +7082,7 @@ def test_namedtuple_keyword_usage(self):
70497082 ):
70507083 NamedTuple ('Name' , None , x = int )
70517084
7085+ @skipUnless (sys .version_info <= (3 , 15 ), "Behavior removed in 3.15" )
70527086 def test_namedtuple_special_keyword_names (self ):
70537087 with self .assertWarnsRegex (
70547088 DeprecationWarning ,
@@ -7064,6 +7098,7 @@ def test_namedtuple_special_keyword_names(self):
70647098 self .assertEqual (a .typename , 'foo' )
70657099 self .assertEqual (a .fields , [('bar' , tuple )])
70667100
7101+ @skipUnless (sys .version_info <= (3 , 15 ), "Behavior removed in 3.15" )
70677102 def test_empty_namedtuple (self ):
70687103 expected_warning = re .escape (
70697104 "Failing to pass a value for the 'fields' parameter is deprecated "
0 commit comments