last day (15 days later) » 

12:39
0
Q: Как интерполировать произвольную строку произвольным JSON?

AyconЯ создал таблицу уведомлений в своей базе данных. Я не знаю заранее, как будет выглядеть сообщение уведомления, но я знаю, что оно может быть очень сложным и включать в себя не только текст, но и HTML вставки, списки, сложные вложенные объекты и т.д. Чтобы сделать таблицу уведомлений, я добавил в...

Что-то я не очень понял суть. Если вы храните message и associated_data вместе, то какой смысл их вообще разделять, почему бы не интерполировать всё сразу и хранить один-единственный готовый message?
GPT подсказал мне такую функцию, как str.format_map(mapping), но она не поддерживает позиционные арзументы, выдаёт ValueError: Format string contains positional fields
@andreymal Я должен был уточнить, message на самом деле хранится в другой таблице и он общий для мнгогих уведомлений, в notifications хранится лишь его id. Он как шаблон.
Тогда берите любой шаблонизатор на ваш вкус
(а если взять кроссплатформенный шаблонизатор вроде mustache, то можно будет интерполировать везде — и на бэкенде, и на фронтенде, и в нативных приложениях и так далее)
@andreymal, наверное format_map ограничусь. Правда, я думал в python есть такая функция, которая и позиционнно и по идентификатору интерполирует строки. Это ведь так похоже на *args **kwargs
А ещё фраза {features.count} функций намекает, что шаблонизатор должен так или иначе уметь работать с формами множественного числа, потому что 1 функций звучит как-то не очень
Хотя я тут сейчас потыкал — на самом деле format всё поддерживает: "{features[count]}".format(features={"count": 12})
Кстати, в ваших примерах использовать {0} нельзя, потому что JSON не сохраняет порядок объектов в словарях
12:39
@andreymal воу, спасибо. Не знал.
@andreymal grep.cs.msu.ru/python3.8_RU/digitology.tech/docs/python_3/… ``` Кодеры и декодеры этого модуля по умолчанию сохраняют порядок ввода и вывода. Порядок теряется только в том случае, если нижележащие контейнеры не упорядочены. До Python 3.7 dict, не гарантировал порядок, таким образом, входы и выходы, как правило, скремблировались, если collections.OrderedDict конкретно не запрашивался. Начиная с Python 3.7, обычный dict стал сохранять порядок, поэтому больше нет необходимости указывать collections.OrderedDict для JSON генерации и парсинга. ```
А вы уверены, что вы ВСЕГДА будете использовать ТОЛЬКО питоновый JSON и что никакая другая реализация в каком-нибудь другом языке программирования не сломает вам порядок? Если проект планирует существовать дольше чем месяц, то я бы не был так уверен (и по этой же причине я бы на всякий случай избегал использования format и других питоноспецифичных штук)
@andreymal я использую JSON только потому, что в PostgreSQL нет поля с типом PythonObject
Ну вот значит можете ожидать, что этот самый PostgreSQL испортит вам порядок
@andreymal не найдётся ссылка на спецификацию, где сказано, что порядок ключей в JSON может измениться? Я не нашёл такого. В моём понимании это может случиться только в момент парсинга, когда JSON объект пытаются запихнуть в не сортируемый перечислимый объект, не так ли?
Да вот сразу на json.org/json-en.html прямым текстом написано "An object is an unordered set of name/value pairs"
"когда JSON объект пытаются запихнуть в не сортируемый перечислимый объект" - то есть почти всегда почти в любом языке программирования. Python здесь является чуть ли не единственным исключением, да и то лишь начиная с версии 3.7
12:39
@andreymal так я сам его паршу. Я же на джанго сайт делаю, генерю HTML вставки в сообщение на основе этих данных. Когда я говорил, что не знаю что там будет храниться, я имел в виду, что не знаю какие ещё уведомления будут реализованы. Они могут содержать весьма сложные данные.
Ну, если в будущем уведомления понадобится парсить и интерполировать не только в джанго, не говорите, что я вас не предупреждал 🙃
@andreymal, вы правы, но если мы сменим Django на "что-нибудь" другое, то это просто будет означать, что это другой сервис и разработка всё-равно пойдёт с нуля.

last day (15 days later) »