Как установить логические значения в файле конфигурации INI?

Я видел множество способов использования булевых значений в файлах INI:

  • variable = true
  • variable = 1
  • variable = on
  • variable = yes

Каков самый канонический, общий и/или предпочтительный способ?

Ответы

Ответ 1

Нет никаких спецификаций для файлов INI, но для того, что стоит, я расскажу о поведении нескольких реализаций на языках, которые я знаю.

Встроенный модуль configparser Python предлагает getboolean, который ведет себя следующим образом:

принятые значения... '1', 'yes', 'true' и 'on', которые заставляют этот метод возвращать True и '0', 'no', 'false', и 'off', которые заставляют его возвращать False.

В PHP parse_init_file, с другой стороны:

Значения строк "true", "on" и "yes" преобразуются в TRUE. "false", "off", "no" и "none" считаются FALSE.

В то же время .NET не имеет встроенной поддержки анализа INI, но его наиболее популярная библиотека INI-анализа, ini-parser, не предлагает никакой поддержки для автоматического анализа значений и возвращает их все строки. Его Приступая к работе примеры показывают разбор булевых файлов с помощью .NET Boolean.Parse, который примет строки "true" и "false" (с любой капитализацией) и выдаст исключение, если дано что-то еще.

Вкратце: нет абсолютно никакой согласованности в этом вопросе между различными реализациями парсеров INI.

Я бы порекомендовал:

  • Если вы только проанализируете свой INI, используя один синтаксический анализатор, проверьте, как ведет себя этот парсер, и создайте свой INI в соответствии с его конкретной реализацией.
  • Если вам нужно поддерживать широкий диапазон парсеров (например, для взаимодействия языков), то либо полностью отказаться от INI, либо полностью исключить использование каких-либо магических логических значений, которые понимают некоторые парсеры, и вместо этого придерживаться 1 и 0.

Ответ 2

Это зависит от анализатора ini файла. Значения всегда являются строками.

true/false: в С# я могу напрямую преобразовать true и false строки в bool. Равно читаемость и простота преобразования. меньше кода.

0/1: мне нужно преобразовать строки 0 и 1 в int перед преобразованием в bool. Меньший размер файла ini. Менее читаемо. больше кода.

yes/no и on/off Мне пришлось бы использовать оператор if/switch. удобочитаемый. больше кода.

Мой предпочтительный путь - true/false. Сериализация объекта в true/false, вы можете использовать true/false с типом бит sql, даже если он хранится как 0/1. Таким образом, единственная нижняя сторона будет размером, который может быть незначительным в большинстве контекстов.