2016-01-12 23 views
17

Chcę użyć OrderedDict, gdzie klucz jest Enum i gdzie element jest określonej klasy.Jak wpisać hint collections.OrderedDict za pośrednictwem python 3.5 typing module

Jak korzystać z modułu do pisania w celu wskazania tego? Jaki jest analogowy to zasugerował namedtuple ::

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

Ale jeśli to zrobię, to jak to jest YourDict a OrderedDict? –

+2

Możesz użyć 'typing.MutableMapping', jeśli potrzebujesz określonego typu dla OrderedDict, powinieneś go stworzyć' class OrderedDictType (OrderedDict, MutableMapping [KT, VT]) ' – AChampion

+2

@ AChampion powinieneś zrobić odpowiedź – Seanny123

Odpowiedz

3

Jak zauważono w komentarzu przez AChampion, można użyć MutableMapping:

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

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

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

Uzupełnienie dla ludzi takich jak ja, którzy nie mają używał modułu typing przed: pamiętaj, że definicje typów używają składni indeksowania() bez nawiasów. Początkowo próbował coś takiego:

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

(! Zwróć uwagę na obcych nawiasów wokół [KT, VT])

Daje to co uważam za dość mylące błąd:

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

addendum, zdaję sobie sprawę, że nie ma żadnego powodu, dla którego nawiasy byłyby sensowne tam, gdzie je umieszczam, ale faktem pozostaje, że to właśnie moje palce wyprodukowały beze mnie naprawdę zauważając, a komunikat o błędzie nie był * całkiem * tak pomocny jak ja Chciałbym. Przeszedłem przez króliczą dziurę podklas wirtualnych 'abc'', zanim zrozumiałem, że popełniłem podstawowy błąd w składni. –

+0

Dziedziczenie z 'MutableSequence' nie ma sensu, ponieważ ten typ nie jest sekwencją, a interfejsy API odwzorowania i sekwencji są niekompatybilne. – user2357112

+0

@ user2357112 * Cały punkt * 'OrderedDictionary' ma być sekwencyjnie iterowalnym typem z gwarantowaną kolejnością iteracji (w przeciwieństwie do zwykłego' dict'). W ten sposób sekwencja [jest zdefiniowana przez 'abc'] (https://docs.python.org/3/glossary.html#term-sequence). I ponownie zauważ, że jest to potwierdzone przez błąd, który pojawia się, gdy * nie * dziedziczysz z 'MutableSequence'. –