Poiché uno OrderedDict
ha le caratteristiche di entrambi un elenco (con elementi ordinati) e un dizionario (con le chiavi anziché gli indici), sembrerebbe naturale che si possa eseguire il troncamento utilizzando le chiavi.Come si può tagliare con le chiavi stringa invece degli interi su un oggetto OrderedDict?
>>> from collections import OrderedDict
>>> cities = OrderedDict((('san francisco', 650), ('new york', 212), ('shanghai', 8621), ('barcelona', 42423)))
>>> test['shanghai':] # I want all the cities from shanghai to the end of the list
TypeError: unhashable type
La cosa interessante di questo è che non è l'errore che si vede a causa di OrderedDictionary.__getslice__
non in corso di attuazione. Ho provato ad aggiungere un mio metodo __getslice__
a OrderedDict
, ma continuo a ricorrere in questo problema TypeError. Sembra che Python stia facendo un tipo di controllo del tipo per far rispettare le chiavi di sezione come numeri interi, prima ancora che siano passati alla funzione __getslice__
, come unpitone!
>>> class BetterOrderedDict(OrderedDict):
def __getslice__(self, start=None, end=None, step=1):
return 'potato'
>>> test = BetterOrderedDict((('one', 1), ('two', 2), ('three', 3), ('four', 4)))
>>> print test[1:4]
'potato' # ok this makes sense so far
>>> test['one':'four']
TypeError: unhashable type # WTF, strings are hashable!
Quindi la mia domanda è: perché non posso implemento fette non-INT, che tipo di tipo controllo impedisce le chiavi fetta da raggiungendo anche la mia funzione __getslice__
, e posso ignorare che implementando il mio BetterOrderedDict
in C con attacchi?
Si desidera creare una fetta da "uno" finché il tasto "quattro"? –
Sì, perché hanno un ordine, dovrebbe essere ok. –
Ma ... perché? qual è lo scopo? –