This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: typing.get_type_hints() raises TypeError for a variable annotated by dataclasses.InitVar
Type: Stage: resolved
Components: Library (Lib) Versions: Python 3.10, Python 3.9
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: eric.smith Nosy List: JelleZijlstra, eric.smith, tkomiya, uriyyo
Priority: normal Keywords: patch

Created on 2021-07-31 17:19 by tkomiya, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 27553 closed uriyyo, 2021-08-02 13:23
Messages (4)
msg398650 - (view) Author: Komiya Takeshi (tkomiya) * Date: 2021-07-31 17:19
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.
msg411228 - (view) Author: Jelle Zijlstra (JelleZijlstra) * (Python committer) Date: 2022-01-22 03:31
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.
msg414969 - (view) Author: Jelle Zijlstra (JelleZijlstra) * (Python committer) Date: 2022-03-12 03:36
This is now fixed in main thanks to bpo-46644:

```
>>> get_type_hints(Foo)
{'attr': dataclasses.InitVar[int]}
```

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.
msg414974 - (view) Author: Eric V. Smith (eric.smith) * (Python committer) Date: 2022-03-12 06:46
I agree it's not worth fixing in 3.9 and 3.10.
History
Date User Action Args
2022-04-11 14:59:48adminsetgithub: 88962
2022-03-12 18:00:32JelleZijlstrasetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2022-03-12 06:46:13eric.smithsetmessages: + msg414974
2022-03-12 03:36:25JelleZijlstrasetmessages: + msg414969
versions: - Python 3.8
2022-01-22 03:31:18JelleZijlstrasetnosy: + JelleZijlstra
messages: + msg411228
2021-08-02 15:00:49eric.smithsetassignee: eric.smith
2021-08-02 14:21:08eric.smithsetnosy: + eric.smith
2021-08-02 13:23:20uriyyosetkeywords: + patch
nosy: + uriyyo

pull_requests: + pull_request26060
stage: patch review
2021-07-31 17:19:44tkomiyacreate