В TOML нет null. У меня — есть (только для Python)
TLDR: TOML — удобный формат конфигураций, но ему не хватает поддержки null. Создатели языка осознанно отказались и отказываются добавлять null. Я столкнулся с этой проблемой при слиянии TOML-конфигураций в своём Python-проекте и решил её, форкнув популярные библиотеки и добавив в них поддержку значения null : tomli-null (парсер) и tomli-w-null (генератор).
TOML — популярный с недавних пор язык конфигурационных файлов, сочетающий избегающий проблемы других языков:
TOML стандартизован, имеет типы данных, позволяет кодировать вложенные структуры (привет, INI);
TOML относительно прост и парсится без хитростей (привет, YAML),
синтаксис TOML легко читаем, поддерживает комментарии и не имеет нюансов вроде ошибок от далёких скобок и лишних запятых (привет, JSON).
TOML, согласно спецификации, "стремится быть минимальным форматом для файлов конфигурации, который легко читается благодаря очевидной семантике". С "минимальностью" языка в принципе можно поспорить — там и отдельные типы для даты/времени (4 штуки, 3 из них имеют варианты синтаксиса), и сахар в числовых литералах вроде 0xFF00_0000, и непростой синтаксис для ключей (чтобы допускать и сочетать простые ключи, составные ключи, произвольные ключи в кавычках).
Но вот что я совершенно не ожидал и проглядел, когда выбирал TOML основным форматом для человеко-редактируемых структур данных в своём проекте, — что в TOML нет null. Вообще. Это осознанное решение создателей языка. Разные аргументы против null, прозвучавшие за это время:
"Если значение не определено, пару ключ-значение просто нужно не указывать." Нужно, не можно.
Случаи, когда в приложении значение по умолчанию отличается от
null, игнорируются."
nullсоздаёт неоднозначность между значениемnullи отсутствием пары ключ-значение.""Если мы разрешим
null, это повлияет на всю систему типов; например, целое число теперь будет не "целое число", а "целое число или null"."???
"Если очень нужно, вы можете использовать специальные значения по своему усмотрению:
0,-1,"","null",[],{}. Ещё можно использовать дополнительные поля для обозначения наличия значения (типа{ present=true, value=100500 }, илиnull_values = ["key_a", "key_c"])."Гора разнообразных костылей с барского плеча, на пустом месте добавляющие кучу боли для интероперабельности, спасибо.
Ответственных за спецификацию годами просят добавить null в будущей версии, ответственные ушли в глухой отказ.
Для меня наличие null в подобном языке было само собой разумеющимся, я даже не думал об этом, когда разрабатывал сложный проект на Python, где файлы TOML пишутся и читаются человеком, пишутся и читаются программами, сливаются друг с другом. Когда я наконец-то напоролся на практике на отсутствие null (при слиянии конфигураций), менять всё на YAML было уже слишком поздно, а костыли добавили бы слишком много сложности.
Поэтому я форкнул пару библиотек и добавил в них поддержку null самым очевидным образом, не нуждающимся даже в примерах — просто литерал null на стороне TOML соответствует None на стороне Python.
tomli-null — парсер, форк tomli (
tomliвключена в Python 3.11 как tomllib);tomli-w-null — генератор, форк tomli-w.
(100% покрытие тестами прилагается само собой.)
P.S. PyPI очень... интересным образом показывает информацию об авторах из пакета, несколько раз напоролся, пока пытался убрать автора оригинальных библиотек из поля "для связи" на сайте.


















