2016-01-12 8 views
17

Ich möchte ein OrderedDict verwenden, wo der Schlüssel eine Enum ist und wo das Element eine bestimmte Klasse ist.wie tipp collections.OrderedDict über python eingeben 3.5 typing modul

Wie benutze ich das Tippmodul, um dies anzudeuten? Was ist der Analog dazu namedtuple angedeutet ::

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

Aber wenn ich das tue, wie ist YourDict ein OrderedDict? –

+2

Sie könnten 'typing.MutableMapping' verwenden, wenn Sie einen bestimmten Typ für OrderedDict benötigen, müssten Sie es' class OrderedDictType (OrderedDict, MutableMapping [KT, VT]) ' – AChampion

+2

@AChampion erstellen, das Sie eine Antwort geben sollten – Seanny123

Antwort

3

Wie in einem Kommentar von AChampion erwähnt, können Sie MutableMapping verwenden:

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

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

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

Nachtrag für Leute wie mich, die nicht haben zuvor das Modul typing verwendet: Beachten Sie, dass die Typdefinitionen die Indexierungssyntax ([T]) ohne Klammern verwenden. Ich versuchte zunächst so etwas wie dieses:

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

(! Beachten Sie die Fremd Klammern um [KT, VT])

Dies gibt, was ich einen ziemlich verwirrend Fehler betrachten:

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

Für die Nachtrag, ich merke, dass es keinen guten Grund gibt, warum Klammern dort, wo ich sie platziere, irgendeinen Sinn ergeben würden, aber Tatsache ist, dass meine Finger produziert haben, ohne dass ich es wirklich bemerkte, und die Fehlermeldung war nicht so hilfreich wie ich hätte mir gefallen. Ich ging in das Kaninchenloch der virtuellen Unterklassen von "abc", bevor ich herausfand, dass ich einen grundlegenden Syntaxfehler gemacht hatte. –

+0

Die Übernahme von 'MutableSequence' ist nicht sinnvoll, da dieser Typ keine Sequenz ist und die APIs für die Zuordnung und Sequenz nicht kompatibel sind. – user2357112

+0

@ user2357112 Der * gesamte Punkt * eines 'OrderedDictionary' soll ein sequenziell iterbarer Typ mit garantierter Iterationsreihenfolge sein (anders als ein normales' dict'). So wird eine Sequenz [durch 'abc' definiert] (https://docs.python.org/3/glossary.html#term-sequence). Beachten Sie auch, dass dies durch den Fehler bestätigt wird, der auftritt, wenn Sie * nicht von "MutableSequence" erben. –