2016-01-12 7 views
17

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

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

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

Но если я сделаю это, как это YourDict OrderedDict? –

+2

Вы можете использовать 'typing.MutableMapping', если вам нужен определенный тип для OrderedDict, вам нужно будет создать его' class OrderedDictType (OrderedDict, MutableMapping [KT, VT]) ' – AChampion

+2

@AChampion вы должны сделать ответ – Seanny123

ответ

3

Как было отмечено в комментарии по 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__ 
+0

Для добавление, я понимаю, что нет веской причины, почему круглые скобки имеют какой-то смысл, где я их помещаю, но факт остается фактом: это то, что мои пальцы произвели без меня, даже не замечая, и сообщение об ошибке не было * вполне * полезным, как я 'd понравился. Я спустился по кроличьей дыре виртуальных подклассов 'abc', прежде чем выяснять, что я сделал базовую синтаксическую ошибку. –

+0

Наследование от 'MutableSequence' не имеет смысла, поскольку этот тип не является последовательностью, а API-интерфейсы отображения и последовательности несовместимы. – user2357112

+0

@ user2357112 * Вся точка * 'OrderedDictionary' должна быть последовательным итерабельным типом с гарантированным порядком итерации (в отличие от обычного' dict'). Вот как последовательность [определяется 'abc'] (https://docs.python.org/3/glossary.html#term-sequence). И еще раз обратите внимание, что это подтверждается ошибкой, которая возникает, когда вы * не * наследуете от 'MutableSequence'. –