diff options
Diffstat (limited to 'Lib/typing.py')
| -rw-r--r-- | Lib/typing.py | 33 | 
1 files changed, 20 insertions, 13 deletions
diff --git a/Lib/typing.py b/Lib/typing.py index 8886b08c2e..6da145fcdb 100644 --- a/Lib/typing.py +++ b/Lib/typing.py @@ -1828,23 +1828,30 @@ class _TypedDictMeta(type):          ns['__new__'] = _typeddict_new if name == 'TypedDict' else _dict_new          tp_dict = super(_TypedDictMeta, cls).__new__(cls, name, (dict,), ns) -        anns = ns.get('__annotations__', {}) +        annotations = {} +        own_annotations = ns.get('__annotations__', {}) +        own_annotation_keys = set(own_annotations.keys())          msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type" -        anns = {n: _type_check(tp, msg) for n, tp in anns.items()} -        required = set(anns if total else ()) -        optional = set(() if total else anns) +        own_annotations = { +            n: _type_check(tp, msg) for n, tp in own_annotations.items() +        } +        required_keys = set() +        optional_keys = set()          for base in bases: -            base_anns = base.__dict__.get('__annotations__', {}) -            anns.update(base_anns) -            if getattr(base, '__total__', True): -                required.update(base_anns) -            else: -                optional.update(base_anns) +            annotations.update(base.__dict__.get('__annotations__', {})) +            required_keys.update(base.__dict__.get('__required_keys__', ())) +            optional_keys.update(base.__dict__.get('__optional_keys__', ())) + +        annotations.update(own_annotations) +        if total: +            required_keys.update(own_annotation_keys) +        else: +            optional_keys.update(own_annotation_keys) -        tp_dict.__annotations__ = anns -        tp_dict.__required_keys__ = frozenset(required) -        tp_dict.__optional_keys__ = frozenset(optional) +        tp_dict.__annotations__ = annotations +        tp_dict.__required_keys__ = frozenset(required_keys) +        tp_dict.__optional_keys__ = frozenset(optional_keys)          if not hasattr(tp_dict, '__total__'):              tp_dict.__total__ = total          return tp_dict  | 
