[3.12] gh-112509: Fix keys being present in both required_keys and optional_keys in TypedDict (GH-112512) (#112530)

(cherry picked from commit 4038869423)

Co-authored-by: Jelle Zijlstra <jelle.zijlstra@gmail.com>
Co-authored-by: Alex Waygood <Alex.Waygood@Gmail.com>
This commit is contained in:
Miss Islington (bot) 2023-11-29 18:55:06 +01:00 committed by GitHub
parent 01b882b390
commit c67812668f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 63 additions and 5 deletions

View file

@ -7509,6 +7509,46 @@ class TypedDictTests(BaseTestCase):
'voice': str,
})
def test_keys_inheritance_with_same_name(self):
class NotTotal(TypedDict, total=False):
a: int
class Total(NotTotal):
a: int
self.assertEqual(NotTotal.__required_keys__, frozenset())
self.assertEqual(NotTotal.__optional_keys__, frozenset(['a']))
self.assertEqual(Total.__required_keys__, frozenset(['a']))
self.assertEqual(Total.__optional_keys__, frozenset())
class Base(TypedDict):
a: NotRequired[int]
b: Required[int]
class Child(Base):
a: Required[int]
b: NotRequired[int]
self.assertEqual(Base.__required_keys__, frozenset(['b']))
self.assertEqual(Base.__optional_keys__, frozenset(['a']))
self.assertEqual(Child.__required_keys__, frozenset(['a']))
self.assertEqual(Child.__optional_keys__, frozenset(['b']))
def test_multiple_inheritance_with_same_key(self):
class Base1(TypedDict):
a: NotRequired[int]
class Base2(TypedDict):
a: Required[str]
class Child(Base1, Base2):
pass
# Last base wins
self.assertEqual(Child.__annotations__, {'a': Required[str]})
self.assertEqual(Child.__required_keys__, frozenset(['a']))
self.assertEqual(Child.__optional_keys__, frozenset())
def test_required_notrequired_keys(self):
self.assertEqual(NontotalMovie.__required_keys__,
frozenset({"title"}))