mirror of
https://github.com/python/cpython.git
synced 2025-11-08 13:42:22 +00:00
bpo-46445: Cover multiple inheritance of TypedDict in test_typing (GH-30719)
This commit is contained in:
parent
881a763cfe
commit
65b88d5e01
1 changed files with 87 additions and 1 deletions
|
|
@ -22,7 +22,6 @@ from typing import get_origin, get_args
|
||||||
from typing import is_typeddict
|
from typing import is_typeddict
|
||||||
from typing import no_type_check, no_type_check_decorator
|
from typing import no_type_check, no_type_check_decorator
|
||||||
from typing import Type
|
from typing import Type
|
||||||
from typing import NewType
|
|
||||||
from typing import NamedTuple, TypedDict
|
from typing import NamedTuple, TypedDict
|
||||||
from typing import IO, TextIO, BinaryIO
|
from typing import IO, TextIO, BinaryIO
|
||||||
from typing import Pattern, Match
|
from typing import Pattern, Match
|
||||||
|
|
@ -4393,6 +4392,93 @@ class TypedDictTests(BaseTestCase):
|
||||||
'voice': str,
|
'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):
|
def test_is_typeddict(self):
|
||||||
assert is_typeddict(Point2D) is True
|
assert is_typeddict(Point2D) is True
|
||||||
assert is_typeddict(Union[str, int]) is False
|
assert is_typeddict(Union[str, int]) is False
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue