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
dict not subscriptable despite using __future__ typing annotations #89280
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}
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.
Activity
stefanistrate commentedon Sep 6, 2021
According to PEP-585 (https://www.python.org/dev/peps/pep-0585/#implementation), I expect that typing aliases could simply use
dictinstead oftyping.Dict. This works without problems in Python 3.9, but in Python 3.8, despite usingfrom __future__ import annotations, I get the following error:However,
dictis subscriptable when not used in an alias:sweeneyde commentedon Sep 7, 2021
Hi Stefan,
from __future__ import annotationsonly affects annotations -- just the things after the colon. It makes it so that annotations are never evaluated, so things like this work: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.