Развёрнутое пояснение:
1. В памяти создаётся объект Tags, содержащий два ключа a и b.
2. Функция json.dumps начинает кодирование этого объекта.
3. Внутренний энкодер CPython сначала проверяет базовые типы: строки, числа, булевы значения, None, списки, кортежи и dict.
4. Tags наследует UserDict, который не является подклассом dict, поэтому объект не попадает в ветку для словарей.
5. Поскольку тип неизвестен энкодеру, вызывается функция default, переданная в аргументе default.
6. В default объект o имеет длину 2, поэтому возвращается строка tags:2.
7. json.dumps кодирует эту строку как JSON-строку, а print выводит tags:2.
Почему это важно: при сериализации пользовательских маппингов, таких как UserDict или ChainMap, нельзя рассчитывать, что json.dumps автоматически превратит их в обычный словарь. Это часто встречается при логировании, отправке конфигурации или сохранении состояния, когда кастомный контейнер оказывается строкой вместо JSON-объекта. Чтобы избежать сюрприза, передавайте данные через dict() или реализуйте собственный JSONEncoder.
Post #4859
346
Python: задачки и вопросы
- ✍ 1