Search
Write a publication
Pull to refresh

Comments 13

Когда читал статью, сложилось впечатление, что проект достаточно свежий, на самом деле - проект живёт уже более 4x лет.
В любом случае, спасибо за качественную статью, плагин кажется разумным и полезным.

Всё верно. Проект зародился ещё в 2019 году, и изначально работал на DjangoJSONEncoder. Только сейчас руки дошли статью написать.
Спасибо за поддержку.

это неплохо вы так переизобрели Deep Equality Test for Nested Python Structures которому уже лет 10. Но так в питоне кругом происходит, так что принимается.

Вопрос первый - почему не сравниваете json структуры? В там есть и параметр сортировки по ключу, и проверка циклических ссылок.

Вопрос второй - тесты с хардкодом ответа в коде, это как бы не очень тесты. Не думали, что этот тест стоило бы переписать? Вам же не равенство константе надо проверять.

Что-то не вижу в Deep Equality Test for Nested Python Structures параметра, чтобы без учёта порядка сравнивать. Это же просто глубокое сравнение структур.
deep_eq([1,2,3], [3,2,1])
Out[7]: False


Конечно, json-структуры пытались сравнивать. В 2019 году именно так это и работало у нас. С этим есть свои сложности. Например, не все объекты можно сериализовать. Опять же, некрасивая подготовка, если в каждом тесте это делать руками. И такой гибкости не было, как сейчас.

А второй вопрос не понял к какому тесту относится. Если к примерам в статье - это же просто самодостаточные примеры, которые легко понять и запустить.

элементы множества должны быть хэшируемыми, коими словари не являются.

Это относится только к конкретной реализации. Разве в питоне нельзя реализовать множество на базе древовидной структуры? Ну или посчитать хеш для словаря? Ни то ни другое не выглядит логически невозможным.

Реализовать можно, но это только всё усложнит. Словари в Python не являются хешируемыми объектами, потому что они изменяемые (mutable).

Ответ не совсем корректный. У класса словарь не реализован метод __hash__ поэтому объекты не являются хешируемыми в python. Но это происходит вне зависимости от мутабельности объектов этого класса. Другой вопрос - почему этот метод не реализован.

Изменяемые объекты не должны быть хешируемыми. Если хеш объекта изменится, это всё сломает. А если содержимое объекта не будет влиять на хеш, то сравнение будет некорректно работать.

Насчет мутабельности я согласен, мутабельные ключи - это немного нонсенс. Но дерево все равно можно построить. Оно не будет такое быстрое, возможно, как хеш таблица, но работать будет.

Сортировка данных в API не требовалась, и делать её только ради тестов казалось нелогичным

Может пропустил, но почему бы в таком случае не отсортировать прямо в тесте? Типа `assert sorted(expected) == sorted(actual)` (ну помимо красивых сообщений об ошибках)

Я не писал об этом, потому что думал, что это и так очевидно...

>>> sorted([{}, {}])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: '<' not supported between instances of 'dict' and 'dict'

понял. Каюсь, статью по диагонали прочитал. Просто и из заголовка, и из названия либы, и из процитированного вступления подумалось, что речь идет о сортируемых данных, которые в данном конкретном апи не упорядочены. А тут скорее речь не об unordered а об unorderable

Sign up to leave a comment.

Articles