Skip to content

multi-level hierarchies of TypedDict no longer return superclass elements in __annotations__ as of 3.14.0b1 when future annotations enabled #133701

Closed
@zzzeek

Description

@zzzeek

Bug report

Bug description:

using get_annotations() or accessing __annotations__ directly on a TypedDict subclass previously returned a dictionary of all attributes in the TypedDict hierarchy, now only returns for the sub-most class. only happens when from __future__ import annotations is used; when not used, then it works as previously. there's no workaround here because the typeddict subclass does not include declared superclasses in its __mro__.

from __future__ import annotations

from typing import TypedDict

import annotationlib

class Base(TypedDict,total=False):
    a: int
    b: int

class Sub(Base,total=False):
    c: float
    d: int

# for both, py3.14.0a7 has all four, py3.14.0b1 has only c, d
# py3.14.0a7: {'a': ForwardRef('int', module='__main__'), 'b': ForwardRef('int', module='__main__'), 'c': ForwardRef('float', module='__main__'), 'd': ForwardRef('int', module='__main__')}
# py3.14.0b1: {'c': 'float', 'd': 'int'}

print(Sub.__annotations__)
print(annotationlib.get_annotations(Sub))

# there's no way to traverse the ``__mro__`` of the Sub class to find
# these annotations since Base is not there; prints
# (<class '__main__.Sub'>, <class 'dict'>, <class 'object'>)
print(Sub.__mro__)

CPython versions tested on:

3.14

Operating systems tested on:

No response

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.14bugs and security fixesstdlibPython modules in the Lib dirtopic-typingtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions