title: Required[str]
year: int
+class ParentNontotalMovie(TypedDict, total=False):
+ title: Required[str]
+
+class ChildTotalMovie(ParentNontotalMovie):
+ year: NotRequired[int]
+
+class ParentDeeplyAnnotatedMovie(TypedDict):
+ title: Annotated[Annotated[Required[str], "foobar"], "another level"]
+
+class ChildDeeplyAnnotatedMovie(ParentDeeplyAnnotatedMovie):
+ year: NotRequired[Annotated[int, 2000]]
+
class AnnotatedMovie(TypedDict):
title: Annotated[Required[str], "foobar"]
year: NotRequired[Annotated[int, 2000]]
'a': Annotated[Required[int], "a", "b", "c"]
})
+ self.assertEqual(get_type_hints(ChildTotalMovie), {"title": str, "year": int})
+ self.assertEqual(get_type_hints(ChildTotalMovie, include_extras=True), {
+ "title": Required[str], "year": NotRequired[int]
+ })
+
+ self.assertEqual(get_type_hints(ChildDeeplyAnnotatedMovie), {"title": str, "year": int})
+ self.assertEqual(get_type_hints(ChildDeeplyAnnotatedMovie, include_extras=True), {
+ "title": Annotated[Required[str], "foobar", "another level"],
+ "year": NotRequired[Annotated[int, 2000]]
+ })
+
def test_get_type_hints_collections_abc_callable(self):
# https://github.com/python/cpython/issues/91621
P = ParamSpec('P')
self.assertEqual(WeirdlyQuotedMovie.__optional_keys__,
frozenset({"year"}))
+ self.assertEqual(ChildTotalMovie.__required_keys__,
+ frozenset({"title"}))
+ self.assertEqual(ChildTotalMovie.__optional_keys__,
+ frozenset({"year"}))
+
+ self.assertEqual(ChildDeeplyAnnotatedMovie.__required_keys__,
+ frozenset({"title"}))
+ self.assertEqual(ChildDeeplyAnnotatedMovie.__optional_keys__,
+ frozenset({"year"}))
+
def test_multiple_inheritance(self):
class One(TypedDict):
one: int