覆盖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