52
52
# 3.12 changes the representation of Unpack[] (PEP 692)
53
53
TYPING_3_12_0 = sys .version_info [:3 ] >= (3 , 12 , 0 )
54
54
55
+ # 3.13 drops support for the keyword argument syntax of TypedDict
56
+ TYPING_3_13_0 = sys .version_info [:3 ] >= (3 , 13 , 0 )
57
+
55
58
# https://github.com/python/cpython/pull/27017 was backported into some 3.9 and 3.10
56
59
# versions, but not all
57
60
HAS_FORWARD_MODULE = "module" in inspect .signature (typing ._type_check ).parameters
@@ -3822,10 +3825,10 @@ class ChildWithInlineAndOptional(Untotal, Inline):
3822
3825
3823
3826
class Closed (TypedDict , closed = True ):
3824
3827
__extra_items__ : None
3825
-
3828
+
3826
3829
class Unclosed (TypedDict , closed = False ):
3827
3830
...
3828
-
3831
+
3829
3832
class ChildUnclosed (Closed , Unclosed ):
3830
3833
...
3831
3834
@@ -3834,7 +3837,7 @@ class ChildUnclosed(Closed, Unclosed):
3834
3837
3835
3838
class ChildClosed (Unclosed , Closed ):
3836
3839
...
3837
-
3840
+
3838
3841
self .assertFalse (ChildClosed .__closed__ )
3839
3842
self .assertEqual (ChildClosed .__extra_items__ , type (None ))
3840
3843
@@ -4195,14 +4198,14 @@ class AllTheThings(TypedDict):
4195
4198
self .assertEqual (AllTheThings .__optional_keys__ , frozenset ({'c' , 'd' }))
4196
4199
self .assertEqual (AllTheThings .__readonly_keys__ , frozenset ({'a' , 'b' , 'c' }))
4197
4200
self .assertEqual (AllTheThings .__mutable_keys__ , frozenset ({'d' }))
4198
-
4201
+
4199
4202
def test_extra_keys_non_readonly (self ):
4200
4203
class Base (TypedDict , closed = True ):
4201
4204
__extra_items__ : str
4202
-
4205
+
4203
4206
class Child (Base ):
4204
4207
a : NotRequired [int ]
4205
-
4208
+
4206
4209
self .assertEqual (Child .__required_keys__ , frozenset ({}))
4207
4210
self .assertEqual (Child .__optional_keys__ , frozenset ({'a' }))
4208
4211
self .assertEqual (Child .__readonly_keys__ , frozenset ({}))
@@ -4211,28 +4214,28 @@ class Child(Base):
4211
4214
def test_extra_keys_readonly (self ):
4212
4215
class Base (TypedDict , closed = True ):
4213
4216
__extra_items__ : ReadOnly [str ]
4214
-
4217
+
4215
4218
class Child (Base ):
4216
4219
a : NotRequired [str ]
4217
-
4220
+
4218
4221
self .assertEqual (Child .__required_keys__ , frozenset ({}))
4219
4222
self .assertEqual (Child .__optional_keys__ , frozenset ({'a' }))
4220
4223
self .assertEqual (Child .__readonly_keys__ , frozenset ({}))
4221
4224
self .assertEqual (Child .__mutable_keys__ , frozenset ({'a' }))
4222
-
4225
+
4223
4226
def test_extra_key_required (self ):
4224
4227
with self .assertRaisesRegex (
4225
4228
TypeError ,
4226
- "Special key __extra_items__ does not support Required and NotRequired "
4229
+ "Special key __extra_items__ does not support Required"
4227
4230
):
4228
4231
TypedDict ("A" , {"__extra_items__" : Required [int ]}, closed = True )
4229
4232
4230
4233
with self .assertRaisesRegex (
4231
4234
TypeError ,
4232
- "Special key __extra_items__ does not support Required and NotRequired"
4235
+ "Special key __extra_items__ does not support NotRequired"
4233
4236
):
4234
4237
TypedDict ("A" , {"__extra_items__" : NotRequired [int ]}, closed = True )
4235
-
4238
+
4236
4239
def test_regular_extra_items (self ):
4237
4240
class ExtraReadOnly (TypedDict ):
4238
4241
__extra_items__ : ReadOnly [str ]
@@ -4263,7 +4266,7 @@ class ExtraNotRequired(TypedDict):
4263
4266
self .assertEqual (ExtraNotRequired .__mutable_keys__ , frozenset ({'__extra_items__' }))
4264
4267
self .assertEqual (ExtraNotRequired .__extra_items__ , None )
4265
4268
self .assertFalse (ExtraNotRequired .__closed__ )
4266
-
4269
+
4267
4270
def test_closed_inheritance (self ):
4268
4271
class Base (TypedDict , closed = True ):
4269
4272
__extra_items__ : ReadOnly [Union [str , None ]]
@@ -4298,7 +4301,7 @@ class GrandChild(Child, closed=True):
4298
4301
self .assertEqual (GrandChild .__annotations__ , {"__extra_items__" : int , "a" : int })
4299
4302
self .assertEqual (GrandChild .__extra_items__ , str )
4300
4303
self .assertTrue (GrandChild .__closed__ )
4301
-
4304
+
4302
4305
def test_implicit_extra_items (self ):
4303
4306
class Base (TypedDict ):
4304
4307
a : int
@@ -4318,6 +4321,11 @@ class ChildB(Base, closed=True):
4318
4321
self .assertEqual (ChildB .__extra_items__ , type (None ))
4319
4322
self .assertTrue (ChildB .__closed__ )
4320
4323
4324
+ @skipIf (
4325
+ TYPING_3_13_0 ,
4326
+ "The keyword argument alternative to define a "
4327
+ "TypedDict type using the functional syntax is no longer supported"
4328
+ )
4321
4329
def test_backwards_compatibility (self ):
4322
4330
with self .assertWarns (DeprecationWarning ):
4323
4331
TD = TypedDict ("TD" , closed = int )
0 commit comments