【问题标题】:PyYAML customized yaml processingPyYAML 自定义 yaml 处理
【发布时间】:2015-10-05 17:39:29
【问题描述】:

我想用一些自定义宏扩展 YAML,以便我可以在同一个文件中“重用”部分定义。示例:

DEFAULTS:
- a
- b
- c
CUSTOM1:
- %DEFAULTS
- d
CUSTOM2:
- %DEFAULTS
- e

导致

CUSTOM1==['a','b','c','d']
CUSTOM2==['a','b','c','e']

不必使用完全相同的语法,只要我能从中获得相同的功能即可。我有什么选择?

附: 我确实意识到可以在解析并重新调整值后只遍历字典,但是我想在加载时这样做。

【问题讨论】:

    标签: python pyyaml


    【解决方案1】:

    YAML 规范中没有选项。唯一接近的是merge syntax,但它用于合并映射,不适用于序列。

    如果您无法切换到在您的上下文中使用映射(并使用 << 合并),IMO 实现此目的的最简洁方法是使 CUSTOM1CUSTOM2 的值成为特定类型,例如expander:

    CUSTOM1: !expander
    - %DEFAULTS
    - d    
    

    映射到将第一个序列元素以% 开头时解释为可替换值的对象。

    【讨论】:

    • 我在 PyYAML API 挂钩方面考虑得更多,但是代码没有很好地记录,因此我不知道要覆盖哪些项目以及要覆盖什么效果。
    • @Droopy4096 如果您希望标准 YAML 映射表现不同,并且您不想对序列进行后处理,那么在解析器中这样做是唯一的选择。但是 PyYAML(以及我的派生 ruamel.yaml theparser 的工作方式是它们没有 context 来访问 %DEFAULTS 引用的顶级键的值。我会去进行后处理,如果您想使用默认映射(即使我非常了解 PyYAML 内部结构)。
    猜你喜欢
    • 2015-03-05
    • 2021-09-28
    • 2020-02-16
    • 1970-01-01
    • 2019-05-15
    • 2017-08-20
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多