Чтение и запись файлов JSON — обычная работа в Python. На самом деле наш анализ 888 кодовых баз показал, что 17% репозиториев либо читают, либо записывают в файлы JSON. Из этих 150 кодовых баз 25% усложняли себе жизнь, не используя встроенную функцию JSON. Ключевой частью нашей работы как разработчиков является снижение сложности кода, который мы пишем, так что это хорошая область улучшения для каждого четвертого разработчика Python.
В конце статьи есть ссылка на статистику. Вы можете проверить статистику. Вы никогда не знаете, ваше репо может быть одним из 888, которые мы проверили!
Многие случаи произошли в крупных проектах с открытым исходным кодом, так что это не просто ошибка новичка. Ради интереса мы перечислили несколько примечательных примеров в конце статьи.
Чтение файлов JSON
Вы когда-нибудь задумывались, почему json.loads
заканчивается на s? Причина в том, что этот метод предназначен специально для работы со строкой, и есть другой родственный метод для работы с файлами: json.load
.
json.loads
предназначен для десериализации строки, содержащей JSON, а json.load
(без 's') — для десериализации файла, содержащего JSON.
Методы очень связаны. По сути, json.load
— это обертка вокруг json.loads
. Это стандартный метод, предоставляемый Python для упрощения задачи чтения JSON из файловоподобных объектов. Например, они приводят к одному и тому же результату:
# bad with open(‘some/path.json’, ‘r’) as f: content = json.loads(f.read()) # good with open(‘some/path.json’, ‘r’) as f: content = json.load(f)
Так почему бы не выбрать самый простой для чтения и записи?
Написание файлов JSON
Подобно json.loads
, json.dumps
также заканчивается на s, потому что это специально для работы со строкой, и есть еще один связанный метод: json.dump
json.dumps
предназначен для JSON-сериализации объекта в строку, а json.dump
(без 's') — для JSON-сериализации объекта в файл.
Опять же, аналогично отношениям между json.load
и json.loads
, json.dump
является оболочкой вокруг json.dumps
. Это стандартный метод, предоставляемый Python для упрощения записи JSON в файлоподобный объект.
Например, они приводят к одному и тому же результату:
# bad with open('some/path.json', 'w') as f: f.write(json.dumps({'foo': 'bar'})) # good with open('some/path.json', 'w') as f: json.dump({'foo': 'bar'}, f)
Так почему бы не выбрать самый простой для чтения и записи?
Уменьшить сложность
Разработчики ядра Python очень внимательно относятся к функциям, включенным во встроенные модули Python, потому что, как только они предоставляют API разработчикам, им очень трудно его удалить. Итак, нам дали несколько инструментов, которые упрощают работу с файлами JSON, поэтому имеет смысл использовать удобные методы, а не изобретать велосипед. По этой причине, когда Code Review Doctor видит разработчиков, не использующих json.load
и json.dump
, дается такой совет:
Примеры
Многие случаи произошли в крупных проектах с открытым исходным кодом, так что это не просто ошибка новичков, а скорее часто упускаемая из виду функция Python:
- Microsoft
- Ansible
- Unicef
- Sentry
- UK Department for International Trade
Статистика
Вы можете прочитать суть:
Чтение JSON: json.load vs json.loads
Запись JSON: json.dump vs json.dumps
Как мы нашли эту статистику? В CodeReview.doctor мы проводим статический анализ кодовых баз, чтобы найти баги и ошибки, которые пропускает большинство людей. В ходе этого процесса мы собираем статистику по публичным репозиториям. Мы отслеживали каждую строку, которую могли найти, где разработчики взаимодействовали с файлами JSON. Мы были удивлены результатами!
Если вы хотите проверить, не затрагивают ли вас подобные проблемы, немедленно бесплатно проверьте свою кодовую базу на CodeReview.doctor.