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: `dict` not subscriptable despite using `__future__` typing annotations
Type: behavior Stage: resolved
Components: Versions: Python 3.8
process
Status: closed Resolution: not a bug
Dependencies: Superseder:
Assigned To: Nosy List: Dennis Sweeney, stefanistrate
Priority: normal Keywords:

Created on 2021-09-06 16:11 by stefanistrate, last changed 2022-04-11 14:59 by admin. This issue is now closed.

Messages (2)
msg401149 - (view) Author: Ștefan Istrate (stefanistrate) Date: 2021-09-06 16:11
According to PEP 585 (https://www.python.org/dev/peps/pep-0585/#implementation), I expect that typing aliases could simply use `dict` instead of `typing.Dict`. This works without problems in Python 3.9, but in Python 3.8, despite using `from __future__ import annotations`, I get the following error:



$ /usr/local/Cellar/python@3.8/3.8.11/bin/python3.8
Python 3.8.11 (default, Jun 29 2021, 03:08:07)
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import annotations
>>> from typing import Any
>>> JsonDictType = dict[str, Any]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'type' object is not subscriptable



However, `dict` is subscriptable when not used in an alias:



$ /usr/local/Cellar/python@3.8/3.8.11/bin/python3.8
Python 3.8.11 (default, Jun 29 2021, 03:08:07)
[Clang 12.0.5 (clang-1205.0.22.9)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from __future__ import annotations
>>> from typing import Any
>>> def f(d: dict[str, Any]):
...     print(d)
...
>>> f({"abc": 1, "def": 2})
{'abc': 1, 'def': 2}
msg401205 - (view) Author: Dennis Sweeney (Dennis Sweeney) * (Python committer) Date: 2021-09-07 04:48
Hi Stefan,

`from __future__ import annotations` only affects annotations -- just the things after the colon. It makes it so that annotations are never evaluated, so things like this work:

    >>> from __future__ import annotations
    >>> x: nonsense()()()()[other_nonsense](1<2>3)

The __future__ import is not a wholesale opt-in-to-all-new-typing-features, it's just an opt-in-to-not-evaluate-annotations.

dict.__class_getitem__ (which is what gets called when you type dict[str, Any]) was not added at all until Python 3.9 (GH-18239), so if you want to *evaluate* such expressions, you have to upgrade to 3.9+. In 3.8, use typing.Dict instead -- 3.8 is no longer accepting new features.

Thanks for the report, but I'm closing this for now.
History
Date User Action Args
2022-04-11 14:59:49adminsetgithub: 89280
2021-09-07 04:48:42Dennis Sweeneysetstatus: open -> closed

nosy: + Dennis Sweeney
messages: + msg401205

resolution: not a bug
stage: resolved
2021-09-06 16:11:44stefanistratecreate