Description
Bug Report
This error only occurs when mypy is run using Python <= 3.8. Here is a minimal reproducible example:
_DictReadMapping = dict
class Foo(_DictReadMapping[str, int]): ... # error: "dict" is not subscriptable
Bar = _DictReadMapping[int, str] # error: "dict" is not subscriptable
The following, however, do not cause an error in Python <= 3.8 in a .pyi
stub file:
_DictReadMapping = dict
Baz: _DictReadMapping[str, int] # type alias used as an annotation: okay
class Spam(dict[str, int]): ... # `dict` used as superclass without a type alias: okay
Expected Behavior
In Python <= 3.8, dict
is not subscriptable at runtime. However, it should be subscriptable in a .pyi
stub file, which does not need to ever be "run". Moreover, it is subscriptable in a .pyi
file if a type alias is not being used. The behaviour should be the same, whether or not you are using a type alias.
Your Environment
This bug has been reproduced on MacOS, Ubuntu and Windows on Python 3.6, 3.7 and 3.8. The mypy version being used is 0.930.
Use case
I came across this bug in an early draft of python/typeshed#6717. As you can see, using this kind of syntax fails the typeshed CI for mypy, but not for any other type checker. (In this case, there was an easy workaround.)