Issue 35341: Add generic version of OrderedDict to typing module (original) (raw)
The other collections from the collections module (namedtuple, deque, ChainMap, Counter, defaultdict) have generic versions in the typing module for use in type annotations.
The problem is currently the following:
from future import annotations import typing from collections import OrderedDict
Understood by mypy
def f(d: OrderedDict[str, str]) -> None: pass typing.get_type_hints(f)
gives:
Traceback (most recent call last): File "foo.py", line 9, in typing.get_type_hints(f) File "/usr/lib/python3.7/typing.py", line 1001, in get_type_hints value = _eval_type(value, globalns, localns) File "/usr/lib/python3.7/typing.py", line 260, in _eval_type return t._evaluate(globalns, localns) File "/usr/lib/python3.7/typing.py", line 464, in _evaluate eval(self.forward_code, globalns, localns), File "", line 1, in TypeError: 'type' object is not subscriptable
To fix this, a line like the following could be added to Lib/typing.py near line 1250:
OrderedDict = _alias(collections.OrderedDict, (KT, VT))
There might be a reasoning for why this has not been done yet, but I have not been able to find any.
If this is acceptable, I could prepare a PR. I suppose there is no hope of a backport to 3.7, since this is a new feature (though very minor).
Yes, since we already have DefaultDict
, Counter
, and ChainMap
from collections, we can also add OrderedDict
.
Now that regular dicts are ordered, my expectation is that OrderedDict() is going to mostly fall into disuse (much like UserDict, UserList, UserString).
That said, it would be nice if all of the collections classes had generic counterparts in the typing module.