我有一个 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 文件,因为某些键没有值。所以我有两个问题:
- 如何定义空任务?
- 如何在 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/