You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
dataclass should use inspect.get_annotations instead of examining cls.__dict__ #97799
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 using from __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 what dataclass 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 using inspect.get_annotations because it didn't want to incur the runtime cost of importing inspect. However, as of this time in CPython trunk, inspect is always imported during startup, and dataclass is already importing it anyway. It's time dataclass changed to best practices here.
No. inspect.get_annotations() does not eval string annotations by default, and #97800 does not pass eval_str=True. And IMO it shouldn't, because that is likely to trigger cycles or failures to eval in currently-working code. (If you want to discuss that any further, please direct it to #83623, not here.)
Activity
larryhastings commentedon Oct 3, 2022
@ericvsmith Tagging you so you see this. Working on a PR.
pythongh-97799: use inspect.get_annotations in dataclass
gh-97799: use inspect.get_annotations in dataclass (#97800)
AlexWaygood commentedon Oct 21, 2022
Closing, as I think this is fixed. (Feel free to reopen if there's more still to do!)
peku33 commentedon Jan 10, 2023
Will this fix #83623 ?
carljm commentedon Jan 10, 2023
No.
inspect.get_annotations()does not eval string annotations by default, and #97800 does not passeval_str=True. And IMO it shouldn't, because that is likely to trigger cycles or failures to eval in currently-working code. (If you want to discuss that any further, please direct it to #83623, not here.)ericvsmith commentedon Jan 10, 2023
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.