YAML: использовать сопоставленный список или массив - PullRequest
0 голосов
/ 24 января 2019

Я создаю файл конфигурации для своего приложения.Для этого я решил использовать YAML для его простоты и надежности.

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

    // Other stuff       
    datasets:
        rate_variation:
            name: Rate variation over time # Optional
            description: Description here # Optional
            type: POINTS_2D
            options:
                REFRESH_TIME: 5 # Time of refresh in second
        frequency_variation:
            name: Frequency variation over time
            description: Description here # Optional
            type: POINTS_2D

Но после некоторого размышления у меня возникли сомнения по этому поводу.Потому что, может быть, что-то вроде этого лучше:

    datasets:
        -   id: rate_variation
            name: Rate variation over time # Optional
            description: Description here # Optional
            type: POINTS_2D
            options:
                REFRESH_TIME: 5 # Time of refresh in second
        -   id: frequency_variation
            name: Frequency variation over time
            description: Description here # Optional
            type: POINTS_2D

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

Что бы вы порекомендовали использовать?И по какой причине?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Быстрый ответ (TL; DR)

  • YAML можно довольно просто и просто нормализовать, используя формат YAML ddconfig
  • Использование этого подхода может упростить конструирование и обслуживание.файлов конфигурации, и сделайте их очень гибкими для последующего использования многими типами приложений-потребителей.

Подробный ответ

Контекст

  • Нормализация данных (иначеОпределение схемы YAML) в формате YAML ddconfig
    • (тег: dreftymac @ dreftymac.org, 2017: ddconfig)

Проблема

  • Сценарий: Разработчик graille_stentiplub создает формат файла конфигурации для использования с YAML.

    • структура данных (т. Е. Схема) для YAMLдолжен быть гибким для использования во многих контекстах.
    • схема должна быть пригодна для произвольных и гибких запросов, когда структура YAML не «мешает».
    • схема должна бытьлегко читать и пониматьd людьми.
    • схема должна легко управляться любой средой программирования, способной обрабатывать стандарт YAML.
  • Особые замечания: graille_stentiplub хочет простой способ определить, когда использовать списки и сопоставления.

Пример

  • Ниже приведен простой файл конфигурации с использованием YAML ddconfig format

    dataroot:
    
        file_metadata_str: |
          ### <beg-block>
          ### - caption: "my first project"
          ###   notes:  |
          ###     * href="//home/sm/docs/workup/my_first_project.txt"
          ### <end-block>
    
        project_info:
          prj_name_nice:        StackOverflow Demo Answer Project
          prj_name_mach:        stackoverflow_demo_001a
          prj_sponsor_url:      https://stackoverflow.com/questions/54349286
          prj_dept_url:         https://demo-university.edu/dept/basketweaving
    
        dataset_recipient_list:
          - graille_stentiplub@example.org
          - dreftymac_lufcrom@demo-university.edu
          - nobody_knows_who_you_are@example.com
    
        dataset_variations_table:
            -   dvar_id:            rate_variation
                dvar_name:          Rate variation over time      # Optional
                dvar_description:   Description here              # Optional
                dvar_type:          POINTS_2D
                dvar_opt_refresh_per_second: 5                    # Time in seconds
    
            -   dvar_id:            frequency_variation
                dvar_name:          Frequency variation over time
                dvar_description:   Description here              # Optional
                dvar_type:          POINTS_2D
    

Объяснение

  • Вся структура данных вложена в ключ верхнего уровня, называемый dataroot (это необязательно).

    • Включение ключа dataroot делает структуру YAML более адресуемой, но не обязательной.
    • Используя аналогию с файловой системой, вы можете рассматривать dataroot как корневой уровеньdirectory.
    • Используя аналогию с XML, вы можете думать об этом как о XML-теге корневого уровня.
  • Вся структура данных состоит из отображения YAML(он же dictionay) (он же ассоциативный массив).

    • каждая картаКлюч ping - это дочерний элемент первого уровня dataroot (или ключ верхнего уровня, если dataroot не указан).
  • Существует четыре типа ключей сопоставления

    • String : (суффикс _str) указывает, что сопоставленное значение является строковым (иначе скалярным) значением.
    • Список : (суффикс _list) указывает, что отображаемое значение является списком (он же последовательность).
    • Info : (суффикс _info) указывает, что сопоставленное значение является отображением (он же словарь) (он же ассоциативный массив)).
    • Таблица : (суффикс _table) указывает, что отображаемое значение является последовательностью отображений (она же таблица).

Обоснование

  • Формат YAML ddconfig прекрасно совпадает со многими различными контекстами и инструментами.
  • Это также позволяет упростить принятие решений при разметке формата файла конфигурации.как упрощенное программирование при разборе файла.
Simplicity
  • a _list Отображение состоит из последовательности масштабированияэлементы ar-значения без вложенности.
  • a _info отображение состоит из скалярного ключа и скалярного значения (пары имя-значение) без вложенности.
  • a _tableОтображение - это просто последовательность _info отображений.
  • Вложение произвольной глубины может быть выполнено с помощью якорей и псевдонимов YAML.
Сходство с реляционными базами данных
  • Вы можете думать оddconfig _info отображение как отдельная запись из стандартной таблицы в реляционной базе данных.
  • Вы можете представить отображение ddconfig _table как таблицу из таблицы реляционной базы данных.
  • Это сходство делает чрезвычайно простым преобразование YAML в базу данных, если и где это необходимо.
Якоря и псевдонимы
  • Формат YAML ddconfig хорошо работает с якорями и псевдонимами YAML.
  • Одно или несколько сопоставлений _info можно легко преобразовать в сопоставление _table с помощью псевдонимов.
  • Несколько отображений _info можно объединить в другое отображение _info с помощью ключей слияния YAML.
0 голосов
/ 24 января 2019

В первом варианте YAML обеспечивает отсутствие дублирующих идентификаторов. Поэтому редактор, поддерживающий YAML, может поддержать вашего пользователя, показывая ошибку в этом случае. При втором варианте вам нужно проверить уникальность в вашем коде, и пользователь увидит ошибку только при загрузке синтаксически правильного YAML в ваше приложение.

Однако есть и другие факторы, которые следует учитывать. Например, у вас может быть предпочтение к результирующим структурам данных в памяти. Если вы используете стандартные реализации YAML, которые десериализуются в собственные структуры данных (PyYAML, SnakeYAML и т. Д.), Структура YAML навязывает тип структуры данных в памяти (вы можете настроить ее, написав пользовательские конструкторы, но это не тривиально). Например, если вы хотите запросить у объекта набора данных его идентификатор, который можно напрямую выполнить только со второй структурой - если вы используете первую структуру, вам нужно будет найти в родительской таблице значение набора данных, которое необходимо получить для его идентификатора. .

Итак, окончательный ответ (как всегда): это зависит. Подумай, что ты хочешь с этим делать. Для простых файлов конфигурации мой второй аргумент может быть слабее моего первого, но я не знаю, что именно вы хотите сделать с данными.

...