|
50 | 50 | Number = Union[int, float, Decimal]
|
51 | 51 | StrBytes = Union[str, bytes]
|
52 | 52 |
|
| 53 | + class TypedDict(Dict[str, Any]): |
| 54 | + __annotations__: Dict[str, Type[Any]] |
| 55 | + __total__: bool |
| 56 | + |
53 | 57 |
|
54 | 58 | def str_validator(v: Any) -> Union[str]:
|
55 | 59 | if isinstance(v, str):
|
@@ -549,16 +553,16 @@ def named_tuple_validator(values: Tuple[Any, ...]) -> NamedTupleT:
|
549 | 553 | return named_tuple_validator
|
550 | 554 |
|
551 | 555 |
|
552 |
| -def make_typed_dict_validator(type_: Type[Dict[str, Any]]) -> Callable[[Any], Dict[str, Any]]: |
| 556 | +def make_typed_dict_validator(type_: Type['TypedDict']) -> Callable[[Any], Dict[str, Any]]: |
553 | 557 | from .main import create_model
|
554 | 558 |
|
555 | 559 | field_definitions: Dict[str, Any] = {
|
556 |
| - field_name: (field_type, ... if field_name in type_.__required_keys__ else None) |
| 560 | + field_name: (field_type, ... if type_.__total__ else None) |
557 | 561 | for field_name, field_type in type_.__annotations__.items()
|
558 | 562 | }
|
559 | 563 | TypedDictModel: Type['BaseModel'] = create_model('TypedDictModel', **field_definitions)
|
560 | 564 |
|
561 |
| - def typed_dict_validator(values: Dict[str, Any]) -> Dict[str, Any]: |
| 565 | + def typed_dict_validator(values: 'TypedDict') -> Dict[str, Any]: |
562 | 566 | return TypedDictModel(**values).dict(exclude_unset=True)
|
563 | 567 |
|
564 | 568 | return typed_dict_validator
|
|
0 commit comments