Как вводить коллекции подсказок .OrderedDict через модуль ввода python 3.5

Я хочу использовать OrderedDict, где ключ представляет собой Enum и где элемент является определенным классом.

Как использовать модуль ввода для подсказки? Что такое аналог этого намеченного namedtuple::

Move = typing.NamedTuple('Move', [('actor', Actor), ('location', Location)])

Ответы

Ответ 1

Как отмечено в комментарии от AChampion, вы можете использовать MutableMapping:

class Actor(Enum):
    # ...Actor enum menbers...

class Location:
    # ...Location class body...

class MapActor2Location(OrderedDict, MutableMapping[Actor, Location]):
    pass

Добавление для таких людей, как я, которые ранее не использовали модуль typing: обратите внимание, что в определениях типов используется синтаксис индексирования ([T]) без. Сначала я попробовал что-то вроде этого:

class MyMap(OrderedDict, MutableMapping([KT, VT])): pass

(Обратите внимание на посторонние круглые скобки вокруг [KT, VT]!)

Это дает то, что я считаю довольно запутанной ошибкой:

TypeError: Can't instantiate abstract class MutableMapping with abstract methods __delitem__, __getitem__, __iter__, __len__, __setitem__

Ответ 2

Вопрос о 3.5, но typing.OrderedDict В python 3.7.2 был введен typing.OrderedDict. Таким образом, вы можете написать:

from typing import OrderedDict
Movie = OrderedDict[Actor, Location]

или с обходным путем обратной совместимости, предложенным AChampion

try:
    from typing import OrderedDict
except ImportError:
    from typing import MutableMapping
    OrderedDict = MutableMapping
Movie = OrderedDict[Actor, Location]