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
typing.get_type_hints() raises TypeError for a variable annotated by dataclasses.InitVar #88962
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee='https://github.com/ericvsmith'closed_at=<Date2022-03-12.18:00:32.186>created_at=<Date2021-07-31.17:19:44.535>labels= ['library', '3.9', '3.10']
title='typing.get_type_hints() raises TypeError for a variable annotated by dataclasses.InitVar'updated_at=<Date2022-03-12.18:00:32.185>user='https://github.com/tk0miya'
I found typing.get_type_hints() raises TypeError for a variable annotated by dataclasses.InitVar when lazy annotations evaluation-feature is enabled (a.k.a __future__.annotations).
$ cat test.py
from __future__ import annotations
from dataclasses import dataclass, InitVar
from typing import get_type_hints
@dataclass
class Foo:
attr: InitVar[int]
get_type_hints(Foo)
$ python -V
Python 3.9.6
$ python test.py
Traceback (most recent call last):
File "/Users/tkomiya/work/sphinx/test.py", line 10, in <module>
get_type_hints(Foo)
File "/Users/tkomiya/.pyenv/versions/3.9.6/lib/python3.9/typing.py", line 1424, in get_type_hints
value = _eval_type(value, base_globals, localns)
File "/Users/tkomiya/.pyenv/versions/3.9.6/lib/python3.9/typing.py", line 290, in _eval_type
return t._evaluate(globalns, localns, recursive_guard)
File "/Users/tkomiya/.pyenv/versions/3.9.6/lib/python3.9/typing.py", line 545, in _evaluate
type_ =_type_check(
File "/Users/tkomiya/.pyenv/versions/3.9.6/lib/python3.9/typing.py", line 164, in _type_check
raise TypeError(f"{msg} Got {arg!r:.100}.")
TypeError: Forward references must evaluate to types. Got dataclasses.InitVar[int].
It goes well if lazy annotations evaluation is disabled.
I think this should be fixed in typing.py instead. get_type_hints() should be less strict about what it accepts as a type, so users are free to use annotations in innovative ways.
Static type checkers should have the job of enforcing that type annotations are valid types.
We're not backporting that change to the bugfix branches. If we want to fix this issue in 3.10 and 3.9, we'll have to add a __call__ method to InitVar. My inclination is that that's not worth it.
Activity
tk0miya commentedon Jul 31, 2021
I found
typing.get_type_hints()raises TypeError for a variable annotated bydataclasses.InitVarwhen lazy annotations evaluation-feature is enabled (a.k.a__future__.annotations).It goes well if lazy annotations evaluation is disabled.
JelleZijlstra commentedon Jan 22, 2022
I think this should be fixed in typing.py instead. get_type_hints() should be less strict about what it accepts as a type, so users are free to use annotations in innovative ways.
Static type checkers should have the job of enforcing that type annotations are valid types.
JelleZijlstra commentedon Mar 12, 2022
This is now fixed in main thanks to bpo-46644:
We're not backporting that change to the bugfix branches. If we want to fix this issue in 3.10 and 3.9, we'll have to add a
__call__method toInitVar. My inclination is that that's not worth it.ericvsmith commentedon Mar 12, 2022
I agree it's not worth fixing in 3.9 and 3.10.