2015-10-05 63 views
1

我想用一些自定义宏来扩展YAML,这样我就可以在同一个文件中“重用”部分定义。示例:PyYAML自定义yaml处理

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

导致

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

不必是完全相同的语法,只要我能得到相同的功能出来。我有什么选择?

P.S. 我意识到可以在解析并重新调整值之后再行走字典,但是我想在加载时执行此操作。

回答

1

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

如果不能切换到您的环境中使用的映射(并使用<<合并),最彻底的方法,国际海事组织,实现这个是使CUSTOM1价值观和CUSTOM2特定类型,例如expander

CUSTOM1: !expander 
- %DEFAULTS 
- d  

映射到该解释第一序列元件为可替换的值当它与%开始对象。

+0

我在想PyYAML API钩子的问题,但是代码没有很好的记录,因此我不知道哪些项目会被覆盖并产生什么效果。 – Droopy4096

+1

@ Droopy4096如果您希望标准YAML映射的行为不同,并且您不希望后处理序列,那么在解析器中这样做是唯一的选择。但PyYAML(和我的衍生物[ruamel.yaml](https://pypi.python.org/pypi/ruamel.yaml)theparser的工作方式是他们没有* context *来访问如果你想使用默认映射(尽管我知道PyYAML内部结构很好),我会去后处理。 – Anthon