2016-01-12 20 views
17

Anahtarın bir Enum olduğu ve öğenin belirli bir sınıf olduğu bir OrderedDict kullanmak istiyorum.ipucu collections.OrderedDict python 3.5 yazarak nasıl yazılır Modül

Bunu yazmak için yazım modülünü nasıl kullanırım?

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

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

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

Ek'ini yapmadıysanız benim gibi insanlar için: bu analog AChampion tarafından yorumunda belirtildiği gibi, MutableMapping kullanabilirsiniz namedtuple ::

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

Ama nasıl bunu yaparsa, bir OrderedDict mı? –

+2

'typing.MutableMapping' kullanabilirsiniz, eğer OrderedDict için belirli bir tür gerekiyorsa, onu oluşturmak gerekirdi 'class OrderedDictType (OrderedDict, MutableMapping [KT, VT])' – AChampion

+2

@AChampion bir cevap – Seanny123

cevap

3

ima nedir typing modülünü daha önce kullandı: tür tanımlarının, parantez olmadan indeksleme sözdizimini ([T]) kullandığını unutmayın.

Bu benim oldukça kafa karıştırıcı hata düşündükleri verir

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

([KT, VT] etrafında gereksiz parantez Not!): Başlangıçta böyle bir şey denedik

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

yapmak gerekir addendum, parantezin onları nereye koyduğum konusunda herhangi bir mantık yaratamayacağının iyi bir nedeni olmadığını fark ettim, ama gerçek şu ki, parmaklarım bensiz ürettiğim şey gerçekten farkediyor ve hata mesajı bende * Sevdim. Abc'nin "sanal altsınıflarının" tavşan deliğinden aşağı indiğimde, temel bir sözdizimi hatası yaptım. –

+0

'MutableSequence' öğesinden devralınması, bu tür bir dizi olmadığından ve eşleme ve sıra API'ları uyumsuz olduğundan hiçbir anlam ifade etmemektedir. – user2357112

+0

@ user2357112 Bir "OrderedDictionary" öğesinin * tüm noktası *, garantili yineleme sırası olan (normal bir 'dict' öğesinin aksine) sıralı olarak yinelenebilir bir tür olmaktır. Bu, bir dizinin [abc] tarafından nasıl tanımlandığıdır (https://docs.python.org/3/glossary.html#term-sequence). Ve yine, bunun, * MutableSequence öğesinden miras almadığınız zaman gerçekleşen hatayla doğrulandığını unutmayın. –