Я заметил это поразительное несоответствие в отношениях между dict
с и OrderedDict
с. Из документов:
Проверка на равенство между объектами OrderedDict чувствительна к порядку и реализована как list(od1.items())==list(od2.items())
. Тесты на равенство между OrderedDict
объектами и другими объектами Mapping не зависят от порядка, как обычные словари. Это позволяет заменять OrderedDict
объектов везде, где используется обычный словарь.
Это проблема, поскольку она нарушает транзитивное свойство равенства , как показано ниже.
Мои вопросы : есть ли для этого веские основания (кроме "... позволяет объектам OrderedDict подставляться ...")? Существуют ли другие стандартные типы python, которые нарушают транзитивное свойство равенства ?
Все следующие тесты должны быть эквивалентными, но они не являются:
od1 = OrderedDict([(1,1), (2,2)])
od2 = OrderedDict([(2,2), (1,1)])
d = dict(od1)
d == od1 == od2 # False
od1 == d == od2 # True ...
od1 == od2 == d # False
Мне кажется, это должно было быть так:
Коллекция упорядочена , т.е. заказ является частью ее значения, в этом случае сравнение с неупорядоченным dict
не должно определяться (так же, как сравнение list
с set
)
Коллекция не заказана , в этом случае od1==od2
. Порядок все еще может поддерживаться для итерации, но не считается частью значения .