mirror of
https://github.com/python/cpython.git
synced 2025-07-31 07:04:42 +00:00
bpo-46445: Cover multiple inheritance of TypedDict
in test_typing
(GH-30719)
(cherry picked from commit 65b88d5e01
)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
This commit is contained in:
parent
d548c87171
commit
46e6aad129
1 changed files with 87 additions and 1 deletions
|
@ -19,7 +19,6 @@ from typing import get_origin, get_args
|
|||
from typing import is_typeddict
|
||||
from typing import no_type_check, no_type_check_decorator
|
||||
from typing import Type
|
||||
from typing import NewType
|
||||
from typing import NamedTuple, TypedDict
|
||||
from typing import IO, TextIO, BinaryIO
|
||||
from typing import Pattern, Match
|
||||
|
@ -4302,6 +4301,93 @@ class TypedDictTests(BaseTestCase):
|
|||
'voice': str,
|
||||
}
|
||||
|
||||
def test_multiple_inheritance(self):
|
||||
class One(TypedDict):
|
||||
one: int
|
||||
class Two(TypedDict):
|
||||
two: str
|
||||
class Untotal(TypedDict, total=False):
|
||||
untotal: str
|
||||
Inline = TypedDict('Inline', {'inline': bool})
|
||||
class Regular:
|
||||
pass
|
||||
|
||||
class Child(One, Two):
|
||||
child: bool
|
||||
self.assertEqual(
|
||||
Child.__required_keys__,
|
||||
frozenset(['one', 'two', 'child']),
|
||||
)
|
||||
self.assertEqual(
|
||||
Child.__optional_keys__,
|
||||
frozenset([]),
|
||||
)
|
||||
self.assertEqual(
|
||||
Child.__annotations__,
|
||||
{'one': int, 'two': str, 'child': bool},
|
||||
)
|
||||
|
||||
class ChildWithOptional(One, Untotal):
|
||||
child: bool
|
||||
self.assertEqual(
|
||||
ChildWithOptional.__required_keys__,
|
||||
frozenset(['one', 'child']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithOptional.__optional_keys__,
|
||||
frozenset(['untotal']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithOptional.__annotations__,
|
||||
{'one': int, 'untotal': str, 'child': bool},
|
||||
)
|
||||
|
||||
class ChildWithTotalFalse(One, Untotal, total=False):
|
||||
child: bool
|
||||
self.assertEqual(
|
||||
ChildWithTotalFalse.__required_keys__,
|
||||
frozenset(['one']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithTotalFalse.__optional_keys__,
|
||||
frozenset(['untotal', 'child']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithTotalFalse.__annotations__,
|
||||
{'one': int, 'untotal': str, 'child': bool},
|
||||
)
|
||||
|
||||
class ChildWithInlineAndOptional(Untotal, Inline):
|
||||
child: bool
|
||||
self.assertEqual(
|
||||
ChildWithInlineAndOptional.__required_keys__,
|
||||
frozenset(['inline', 'child']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithInlineAndOptional.__optional_keys__,
|
||||
frozenset(['untotal']),
|
||||
)
|
||||
self.assertEqual(
|
||||
ChildWithInlineAndOptional.__annotations__,
|
||||
{'inline': bool, 'untotal': str, 'child': bool},
|
||||
)
|
||||
|
||||
wrong_bases = [
|
||||
(One, Regular),
|
||||
(Regular, One),
|
||||
(One, Two, Regular),
|
||||
(Inline, Regular),
|
||||
(Untotal, Regular),
|
||||
]
|
||||
for bases in wrong_bases:
|
||||
with self.subTest(bases=bases):
|
||||
with self.assertRaisesRegex(
|
||||
TypeError,
|
||||
'cannot inherit from both a TypedDict type and a non-TypedDict',
|
||||
):
|
||||
class Wrong(*bases):
|
||||
pass
|
||||
|
||||
def test_is_typeddict(self):
|
||||
assert is_typeddict(Point2D) is True
|
||||
assert is_typeddict(Union[str, int]) is False
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue