覆盖yaml映射中的变量值
我在覆盖yaml映射中的变量值,yaml,pyyaml,Yaml,Pyyaml,我在yaml中定义了一个映射,如下所示: default: &DEFAULT bucket: &bucket default_path # Make sure that the second parameter of join doesn't start with a / # otherwise it is interpreted as an absolute path and join won't work path1: !!python/o
yaml
中定义了一个映射,如下所示:
default: &DEFAULT
bucket: &bucket default_path
# Make sure that the second parameter of join doesn't start with a /
# otherwise it is interpreted as an absolute path and join won't work
path1: !!python/object/apply:os.path.join [*bucket, work_area/test1]
path2: !!python/object/apply:os.path.join [*bucket, work_area/test2]
我需要定义更多的键,其中唯一要覆盖的值是bucket
,例如:
production:
<<: *DEFAULT
bucket: "s3://production-bucket"
生产:
“s3://生产桶/工作区/test1”
在
yaml
中有什么方法可以做到这一点吗
从语法上可以明显看出,我使用
pyyaml
解析文件。YAML解释器应该使用锚的最新定义:
别名节点由“*”指示符表示。别名是指具有相同锚点的最近的前一个节点。alias节点使用文档中以前未出现的锚点是错误的。指定任何alias节点都不使用的锚点不是错误
因此,即使PyYAML(3.10/3.11)在尝试解析时不会抛出编写器错误
:
default: &DEFAULT
bucket: &bucket default_path
# Make sure that the second parameter of join doesn't start with a /
# otherwise it is interpreted as an absolute path and join won't work
path1: !!python/object/apply:os.path.join [*bucket, work_area/test1]
path2: !!python/object/apply:os.path.join [*bucket, work_area/test2]
production:
<<: *DEFAULT
bucket: &bucket "s3://production-bucket"
这将给你:
s3://production-bucket/work_area/test1
这是我作为作者使用的 您使用的是哪个版本的PyYAML?在3.10版本中,当我尝试重新定义
bucket
锚定时,我遇到了一个错误。感谢您的评论。我实际上使用了3.11,但我在问题中复制粘贴了错误的案例。我现在编辑了它。当使用`bucket:&bucket“s3://production bucket”`时,我还得到了composer错误
现在你再也没有重新定义锚bucket
。我认为,使用与锚点相同的映射键名称会让您感到困惑,但与定义锚点(以及解析别名)完全无关。看看我的答案。
s3://production-bucket/work_area/test1