New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
dataclass should use inspect.get_annotations instead of examining cls.__dict__ #97799
Comments
@ericvsmith Tagging you so you see this. Working on a PR. |
dataclass used to get the annotations on a class object using cls.__dict__.get('__annotations__'). Now that it always imports inspect, it can use inspect.get_annotations, which is modern best practice for coping with annotations.
dataclass used to get the annotations on a class object using cls.__dict__.get('__annotations__'). Now that it always imports inspect, it can use inspect.get_annotations, which is modern best practice for coping with annotations.
Closing, as I think this is fixed. (Feel free to reopen if there's more still to do!) |
Will this fix #83623 ? |
No. |
I agree with @carljm. In addition, I don't think there should be changes made to how dataclasses uses annotations until PEP 649 is implemented. |
dataclass
needs to examine the annotations of class objects it decorates. Due to__annotations__
being badly designed, it currently pulls the__annotations__
out of the class dict (cls.__dict__.get('__annotations__')
). While this works today, this wouldn't work properly for classes defiend in modules usingfrom __future__ import co_annotations
if PEP 649 is accepted. It's also not recommended best practices for working with annotations. (Which, admittedly, I wrote.)Best practices call for using
inspect.get_annotations
to get the annotations on any object. This does exactly whatdataclass
wants; it doesn't inherit base class annotations if no child class defines annotations, and it always returns a dict. (Empty, if appropriate.)dataclass
has in the past resisted usinginspect.get_annotations
because it didn't want to incur the runtime cost of importinginspect
. However, as of this time in CPython trunk,inspect
is always imported during startup, anddataclass
is already importing it anyway. It's timedataclass
changed to best practices here.The text was updated successfully, but these errors were encountered: