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

Gab*_*les 10 python xml configuration json 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
Run Code Online (Sandbox Code Playgroud)

在纯 Python 文件中也有同样的事情:

my_params.py

data = {
    "dict_key1": {
        "dict_key2": {
            "dict_key3a": "my string message",
            "dict_key3b": "another string message",
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

读取 YAML 和 Python 数据并将其打印出来:

导入配置文件.py:

import yaml # Module for reading in YAML files
import json # Module for pretty-printing Python dictionary types
            # See: /sf/answers/2401466931/

# 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))
Run Code Online (Sandbox Code Playgroud)

使用参考json.dumps/sf/answers/2401466931/

运行的示例输出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"
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*hon 2

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

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

你应该做的是使用astPython附带的包来解析你的“数据”结构,以使这样的导入安全。我的包pon具有更新此类结构的代码,并且在我的每个__init__.py文件中都有这样一条名为的数据,该数据由包中的某些代码(函数)_package_data读取。setup.py 中的基础代码大约需要 100 行。literal_evalsetup.pyast

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