Так как a 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
Интересно, что это не ошибка, которую вы видите из-за OrderedDictionary.__getslice__
не выполняются. Я попытался добавить свой собственный метод __getslice__
к OrderedDict
, но я все время сталкиваюсь с этой проблемой TypeError. Похоже, что Python делает некоторую проверку типов, чтобы обеспечить, чтобы ключи среза были целыми числами, прежде чем они даже передаются функции __getslice__
, как unpythonic!
>>> 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!
Итак, мой вопрос заключается в том, почему я не реализую не-int-фрагменты, что такое проверка типов, препятствует тому, чтобы ключи среза даже достигли моей функции __getslice__
, и могу ли я переопределить ее, реализовав мой BetterOrderedDict
в C с привязками?