Несоответствие сравнения OrderedDict - PullRequest
0 голосов
/ 25 апреля 2020

Я заметил это поразительное несоответствие в отношениях между 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

Мне кажется, это должно было быть так:

  1. Коллекция упорядочена , т.е. заказ является частью ее значения, в этом случае сравнение с неупорядоченным dict не должно определяться (так же, как сравнение list с set)

  2. Коллекция не заказана , в этом случае od1==od2. Порядок все еще может поддерживаться для итерации, но не считается частью значения .

...