python - 加载 YAML 保留顺序

标签 python yaml configuration-files

我有一个 Python 库,它定义了一个如下列表所示的列表:

config = [
    'task_a',
    ('task_b', {'task_b_opt_1': ' '}),
    ('task_a', {'task_a_opt_1': 42}),
    ('task_c', {'task_c_opt_1': 'foo', 'task_c_opt_2': 'bar'}),
    'task_b'
]

基本上,此列表定义了 5 项任务,这些任务必须按特定顺序并使用定义的参数(如果有)应用。另外,同一个任务可以定义参数,也可以不定义参数(使用默认值)。

现在我想扩展该库以支持配置文件。为了让最终用户更容易使用,我正在考虑使用 YAML 文件。所以上面的代码会变成这样:

task_a:
task_b:
  task_b_opt_1: ' '
task_a:
  task_a_opt_1: 42
task_c:
  task_c_opt_1': 'foo'
  task_c_opt_2': 'bar'
task_b:

这甚至不是有效的 YAML 文件,因为某些键没有值。所以我有两个问题:

  1. 如何定义空任务?
  2. 如何在 Python 中加载文件时保留顺序?

如果这些都不可行,还有其他解决方案吗?

最佳答案

在 YAML 中,映射被定义为无序的。典型的解决方案是使其成为映射列表。但是,值(甚至键)可能会丢失,在这种情况下它们隐式为 null(相当于 Python 中的 None)

- task_a:
- task_b:
    task_b_opt_1: ' '
- task_a:
    task_a_opt_1: 42
- task_c:
    task_c_opt_1: 'foo'
    task_c_opt_2: 'bar'
- task_b:

另一个选择是不将没有选项的任务放入映射中,而是使用字符串,只需从这些行中删除 : 即可:

- task_a
- task_b:
    task_b_opt_1: ' '
- task_a:
    task_a_opt_1: 42
- task_c:
    task_c_opt_1: 'foo'
    task_c_opt_2: 'bar'
- task_b

关于python - 加载 YAML 保留顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44034534/

相关文章:

linux - 在多个节点修改配置文件

python - 为什么 SQLite 中的多列索引会降低查询的性能,除非索引所有列?

php - SF4 身份验证工作但未保存 token (从未调用序列化)

r - 如何在 R Markdown 的 YAML 元数据中创建多级字典?

安卓配置文件

linux - 我可以为 Slurm sbatch 设置默认选项吗?

python - 尝试对两个数组求和

python - Pandas Series 写入和读取 json 数据时会出现带有 to_json 和 read_json 的 ValueError

python - 如何优化 python 列表中的比较组合

java - 将变量/对象保存到 YAML 文件(Spigot)