【问题标题】:YAML vs Python configuration/parameter files (but perhaps also vs JSON vs XML)YAML vs Python 配置/参数文件(但也可能 vs JSON vs XML)
【发布时间】:2019-06-28 19:09:16
【问题描述】:

我看到 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"
        }
    }
}

【问题讨论】:

标签: python json xml configuration yaml


【解决方案1】:

是的,人们会这样做,并且已经这样做了多年。

但是很多人犯了你犯的错误,并且使用 import my_params.py 使其变得不安全。这与在ruamel.yaml 中使用YAML(typ='unsafe') 加载YAML 相同(或在PyYAML 中使用yaml.load(),这是不安全的)。

您应该做的是使用 Python 附带的 ast 包来解析您的“数据”结构,以确保这样的导入安全。我的包pon 具有更新这些结构的代码,并且在我的每个__init__.py 文件中都有这样一段名为_package_data 的数据被@987654323 中的某些代码(函数literal_eval)读取@为包裹。 setup.py 中基于 ast 的代码大约需要 100 行。

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

【讨论】:

猜你喜欢
  • 2021-11-14
  • 2011-01-15
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多