YAML против файлов конфигурации / параметров Python (но, возможно, также против JSON против XML) - PullRequest
0 голосов
/ 05 февраля 2019

Я вижу, что Python использовал для генерации большого количества кода для заголовков C / C ++ и исходных файлов.Обычно входные файлы, в которых хранятся параметры, имеют формат JSON или YAML, хотя большинство из того, что я вижу, - это YAML.Однако почему бы просто не использовать файлы Python напрямую?Зачем вообще использовать YAML в этом случае?

Это также заставило меня задуматься: поскольку Python является языком сценариев, его файлы, содержащие только данные и структуры данных, могут буквально использоваться так же, как XML, JSON, YAML и т. Д. Люди делают это?Есть ли хороший вариант использования для этого?

Что если я хочу импортировать файл конфигурации в программу на C или C ++?А как насчет программы на Python?В случае с Python, как мне кажется, вообще не имеет смысла использовать YAML, так как вы можете просто хранить свои параметры конфигурации и переменные в чистых файлах Python.В случае C или C ++ мне кажется, что вы все еще можете хранить свои данные в файлах Python, а затем просто импортировать сценарий Python, который автоматически генерирует заголовочные и исходные файлы для вас как часть процесса сборки.Опять же, возможно, в этом случае вообще нет необходимости в YAML или JSON.

Мысли?

Вот пример хранения некоторых пар вложенных хеш-таблиц ключ / значение в файле YAML:

my_params.yml:

---
dict_key1:
    dict_key2:
        dict_key3a: my string message
        dict_key3b: another string message

И то же самое в чистом файле Python:

my_params.py

data = {
    "dict_key1": {
        "dict_key2": {
            "dict_key3a": "my string message",
            "dict_key3b": "another string message",
        }
    }
}

И прочитать как данные YAML, так и данные Python и распечатать их:

import_config_file.py:

import yaml # Module for reading in YAML files
import json # Module for pretty-printing Python dictionary types; See: https://stackoverflow.com/a/34306670/4561887

# 1) import .yml file
with open("my_params.yml", "r") as f:
    data_yml = yaml.load(f)

# 2) import .py file
from my_params import data as data_py
# OR: Alternative method of doing the above:
# import my_params
# data_py = my_params.data

# 3) print them out
print("data_yml = ")
print(json.dumps(data_yml, indent=4))

print("\ndata_py = ")
print(json.dumps(data_py, indent=4))

Справочник по использованию json.dumps: https://stackoverflow.com/a/34306670/4561887

ОБРАЗЕЦ ВЫХОДА python3 import_config_file.py:

data_yml = 
{
    "dict_key1": {
        "dict_key2": {
            "dict_key3a": "my string message",
            "dict_key3b": "another string message"
        }
    }
}

data_py = 
{
    "dict_key1": {
        "dict_key2": {
            "dict_key3a": "my string message",
            "dict_key3b": "another string message"
        }
    }
}

1 Ответ

0 голосов
/ 05 февраля 2019

Да, люди делают это и делают это годами.

Но многие допускают ошибку, которую вы делаете, и делают ее небезопасной, используя import my_params.py.Это было бы то же самое, что и загрузка YAML с использованием YAML(typ='unsafe') в ruamel.yaml (or yaml.load () `в PyYAML, что небезопасно).

Что вы должны сделать, это использовать пакет astон поставляется вместе с Python для анализа вашей структуры данных, чтобы сделать такой импорт безопасным.В моем пакете pon есть код для обновления таких структур, и в каждом из моих файлов __init__.py есть такой фрагмент данных с именем _package_data, который читаетсянекоторый код в setup.py для пакета.Код на основе ast в файле setup.py занимает около 100 строк.

Преимущество такого структурированного преимущества такое же, как и при использовании YAML: вы можете программно обновлять структуру данных (номера версий!), Хотя я считаю PON (нотация Python Object) менее читабельным, чемYAML и чуть менее легко обновлять вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...