diff --git a/CHANGELOG.md b/CHANGELOG.md index 8be5ebd6..02416f46 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ - Add support for PEP 742, adding `typing_extensions.TypeIs`. Patch by Jelle Zijlstra. -- 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 diff --git a/src/test_typing_extensions.py b/src/test_typing_extensions.py index 12677fd0..53d905e0 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 3ef09259..f39d4c7f 100644 --- a/src/typing_extensions.py +++ b/src/typing_extensions.py @@ -943,6 +943,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)