Comment fusionner les tableaux YAML?

<!-Je voudrais fusionner les tableaux dans YAML, et les charger via ruby -

some_stuff: &some_stuff
 - a
 - b
 - c

combined_stuff:
  <<: *some_stuff
  - d
  - e
  - f

j'aimerais avoir le combiné de tableau [a,b,c,d,e,f]

je reçois l'erreur: n'a pas trouvé la clé attendue lors de l'analyse d'un bloc

comment fusionner des tableaux dans YAML?

40
demandé sur lfender6445 2014-06-07 00:33:16

3 réponses

Contexte

Ce post suppose le contexte suivant:

  • python 2.7
  • Python YAML parser

Problème

lfender6445 souhaite fusionner deux ou plusieurs listes dans un fichier YAML, et avoir les listes fusionnées apparaissent comme une liste unique lorsqu'elles sont analysées.

Solution

cela peut être obtenu simplement en assignant des ancrages YAML à des mappages, où les listes souhaitées apparaissent comme des éléments enfants de cartographie. Dans l'exemple ci-dessous nous avons trois mappages (list_one, list_two, list_three) et trois ancres et des pseudonymes qui renvoient à ces correspondances, le cas échéant.

lorsque le fichier YAML est chargé dans le programme, nous obtenons la liste que nous voulons, mais il peut nécessiter un peu de modification après la charge (voir les pièges ci-dessous).

Exemple

fichier YAML Original

  list_one: &id001
   - a
   - b
   - c

  list_two: &id002
   - e
   - f
   - g

  list_three: &id003
   - h
   - i
   - j

  list_combined:
      - *id001
      - *id002
      - *id003

résultat après YAML.safe_load

## list_combined
  [
    [
      "a",
      "b",
      "c"
    ],
    [
      "e",
      "f",
      "g"
    ],
    [
      "h",
      "i",
      "j"
    ]
  ]

Pièges

Conclusion

cette approche permet la création de listes fusionnées en utilisant les fonctionnalités alias et anchor de YAML.

Bien que le résultat de sortie est une liste imbriquée de listes, cela peut être facilement transformé en utilisant le flatten méthode.

Voir aussi

11
répondu dreftymac 2017-07-18 20:35:41

Ce n'est pas d'aller travailler:

  1. fusionner est uniquement pris en charge par le YAML spécifications pour les mappages et pas pour les séquences
  2. vous mélangez complètement les choses en ayant une touche de fusion << suivi du séparateur clé/valeur : et une valeur de référence et puis continuer avec une liste au même niveau d'indentation

Ce n'est pas correct YAML:

combine_stuff:
  x: 1
  - a
  - b

donc votre syntaxe d'exemple ne serait même pas faites sens en tant que proposition D'extension YAML.

si vous voulez faire quelque chose comme ça, essayez de faire la valeur pour combined_stuff un type spécial que vous spécifiez avec une étiquette YAML, de sorte que l'objet instancié pour ce type sache interpréter les éléments et remplacer cet élément par tous ceux de some_stuff.

9
répondu Anthon 2017-08-15 21:52:08

Vous pouvez fusionner les mappings puis convertir leurs clés en une liste, dans ces conditions:

  • si vous utilisez jinja2 templating et
  • si l'ordre des articles n'est pas important
some_stuff: &some_stuff
 a:
 b:
 c:

combined_stuff:
  <<: *some_stuff
  d:
  e:
  f:

{{ combined_stuff | list }}
0
répondu sm4rk0 2018-01-19 13:35:48