Fix tests on Python 3.13, add note on TypedDict kwargs (#212)
Fixes #204
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8d36fe6..39bf2b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,9 @@
# Unreleased
- Declare support for Python 3.12. Patch by Jelle Zijlstra.
+- Fix tests on Python 3.13, which removes support for creating
+ `TypedDict` classes through the keyword-argument syntax. Patch by
+ Jelle Zijlstra.
# Release 4.6.3 (June 1, 2023)
diff --git a/doc/index.rst b/doc/index.rst
index 6b1a6f0..177f8a1 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -276,6 +276,13 @@
``typing_extensions`` backport provides all of these features and bugfixes on
all Python versions.
+ Historically, ``TypedDict`` has supported an alternative creation syntax
+ where the fields are supplied as keyword arguments (e.g.,
+ ``TypedDict("TD", a=int, b=str)``). In CPython, this feature was deprecated
+ in Python 3.11 and removed in Python 3.13. ``typing_extensions.TypedDict``
+ raises a :py:exc:`DeprecationWarning` when this syntax is used in Python 3.12
+ or lower and fails with a :py:exc:`TypeError` in Python 3.13 and higher.
+
.. versionchanged:: 4.3.0
Added support for generic ``TypedDict``\ s.
diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py
index f9c3389..62c70be 100644
--- a/src/test_typing_extensions.py
+++ b/src/test_typing_extensions.py
@@ -2879,6 +2879,12 @@
self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
self.assertEqual(Emp.__total__, True)
+ @skipIf(sys.version_info < (3, 13), "Change in behavior in 3.13")
+ def test_keywords_syntax_raises_on_3_13(self):
+ with self.assertRaises(TypeError):
+ Emp = TypedDict('Emp', name=str, id=int)
+
+ @skipIf(sys.version_info >= (3, 13), "3.13 removes support for kwargs")
def test_basics_keywords_syntax(self):
with self.assertWarns(DeprecationWarning):
Emp = TypedDict('Emp', name=str, id=int)
@@ -2895,6 +2901,7 @@
self.assertEqual(Emp.__annotations__, {'name': str, 'id': int})
self.assertEqual(Emp.__total__, True)
+ @skipIf(sys.version_info >= (3, 13), "3.13 removes support for kwargs")
def test_typeddict_special_keyword_names(self):
with self.assertWarns(DeprecationWarning):
TD = TypedDict("TD", cls=type, self=object, typename=str, _typename=int,