YAML与Python配置/参数文件(但也可能与JSON和XML)

时间:2019-02-05 00:44:07

标签: python json xml configuration yaml

我看到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 :(得分:0)

是的,而且已经这样做多年了。

但是许多错误使您犯了错误,并通过使用import YAML(typ='unsafe')使其变得不安全。这与在PyYAML中的ruamel.yaml (or yaml.load()`中使用ast加载YAML相同,这是不安全的)。

您应该使用Python附带的__init__.py包来解析“数据”结构,以确保这种导入安全。我的软件包pon包含用于更新此类结构的代码,并且在我的每个ast文件中,都有_package_data这样的数据,该数据由{{ 3}}。 setup.py中基于inspect.signature(Test).parameters.values()的代码大约需要100行。

以结构化方式执行此操作的优势与使用YAML相同:您可以以编程方式更新数据结构(版本号!),尽管我认为PON(Python对象表示法)的可读性比YAML差,并且略微手动更新不太容易。

相关问题