From 4dfba0e760daef674107ca0ca6d4e528663b5314 Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Wed, 14 Feb 2024 11:07:39 -0800 Subject: [PATCH 1/2] Fix changelog entry for PEP 705 change cc @alicederyn --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e052710c..357fb455 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Unreleased -- Drop runtime error when a mutable `TypedDict` key overrides a read-only +- Drop runtime error when a read-only `TypedDict` item overrides a mutable one. Type checkers should still flag this as an error. Patch by Jelle Zijlstra. - Speedup `issubclass()` checks against simple runtime-checkable protocols by From 96527b394dde2d749994f038b524ab48f6b5826a Mon Sep 17 00:00:00 2001 From: Jelle Zijlstra Date: Thu, 15 Feb 2024 20:31:25 -0800 Subject: [PATCH 2/2] Fix mutable keys tracking --- src/test_typing_extensions.py | 6 ++++++ src/typing_extensions.py | 1 + 2 files changed, 7 insertions(+) diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py index 2e8fe7b3..c0cae275 100644 --- a/src/test_typing_extensions.py +++ b/src/test_typing_extensions.py @@ -4147,9 +4147,15 @@ def test_make_mutable_key_readonly(self): class Base(TypedDict): a: int + self.assertEqual(Base.__readonly_keys__, frozenset()) + self.assertEqual(Base.__mutable_keys__, frozenset({'a'})) + class Child(Base): a: ReadOnly[int] # type checker error, but allowed at runtime + self.assertEqual(Child.__readonly_keys__, frozenset({'a'})) + self.assertEqual(Child.__mutable_keys__, frozenset()) + def test_can_make_readonly_key_mutable(self): class Base(TypedDict): a: ReadOnly[int] diff --git a/src/typing_extensions.py b/src/typing_extensions.py index a016e07b..742dbb73 100644 --- a/src/typing_extensions.py +++ b/src/typing_extensions.py @@ -942,6 +942,7 @@ def __new__(cls, name, bases, ns, *, total=True): else: optional_keys.add(annotation_key) if ReadOnly in qualifiers: + mutable_keys.discard(annotation_key) readonly_keys.add(annotation_key) else: mutable_keys.add(annotation_key)