代码之家  ›  专栏  ›  技术社区  ›  Christian Bernini

编辑现有YAML并通过PyYAML复制条目

  •  2
  • Christian Bernini  · 技术社区  · 7 年前

    - description: 'DUMMY_JOB'
      sequence:
        commands:
          - description: Metadata
            script: ASDF
          - description: Login
            jobref:
            args: ASDF
            group: ''
            name: ASDF
            nodeStep: 'true'
          - description: Deployment
            jobref:
            args: ASDF
            group: ''
            name: ASDF
            nodeStep: 'true'
          - description: Logout
            jobref:
            group: ''
            name: ASDF
            nodeStep: 'true'
        keepgoing: false
        strategy: node-first
      uuid: 'UNIQUE_ID'
    

    我正在通过Pyaml加载它:

    jobStream   = open("example.yaml", 'r')
    jobMap      = yaml.safe_load(jobStream)
    

    jobMap[0]['sequence']['commands']
    

    带回我需要的数据。但是,如果我只是通过以下合并方式复制它:

    commandsA = jobMap[0]['sequence']['commands']
    commandsB = jobMap[0]['sequence']['commands']
    jobMap[0]['sequence']['commands'] = commandsA + commandsB
    

    如果我试着做 yaml.dump(jobMap) 它不会复制命令,但会显示ID:

    - *id001
    - *id002
    - *id003
    - *id004
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Anthon    7 年前

    列表中的元素 commandsA 和来自 commandsB 是字典,如果你复制它们,你会在你的结构中得到对相同项目的多个引用,从而导致锚( & *

    获取所需YAML的最快方法可能是使用 deepcopy :

    from copy import deepcopy
    
    jobMap[0]['sequence']['commands'] = deepcopy(commandsA) + deepcopy(commandsB)