Est-il syntaxe YAML pour le partage d'une partie d'une liste ou sur la carte?
Donc, je sais que je peux faire quelque chose comme ceci:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist: *sites
Et ont sitelist
et anotherlist
les deux contiennent www.foo.com
et www.bar.com
. Cependant, ce que je veux vraiment, c'est pour anotherlist
à aussi contenir www.baz.com
, sans avoir à répéter www.foo.com
et www.baz.com
.
Faisant cela me donne une erreur de syntaxe dans le fichier YAML analyseur:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist: *sites
- www.baz.com
Juste en utilisant des ancres et des alias il ne semble pas possible de faire ce que je veux sans ajouter un autre niveau de la sous-structure, tels que:
sitelist: &sites
- www.foo.com
- www.bar.com
anotherlist:
- *sites
- www.baz.com
Ce qui signifie que la consommation de ce fichier YAML est d'en être conscient.
Est-il un pur YAML moyen de faire quelque chose de ce genre? Ou devrai-je utiliser certains post-YAML de traitement, telles que la mise en œuvre de la substitution de variable ou de levage automatique de certains types de sous-structure? Je suis déjà en train de faire ce genre de post-traitement pour gérer un couple de d'autres cas d'utilisation, donc je ne suis pas totalement opposé à elle. Mais mes fichiers YAML vont être écrits par des êtres humains, pas des machines généré, donc je voudrais limiter le nombre de règles qui doivent être mémorisées par mes utilisateurs sur le dessus de la norme syntaxe YAML.
J'aimerais aussi pouvoir faire la même chose avec les cartes:
namedsites: &sites
Foo: www.foo.com
Bar: www.bar.com
moresites: *sites
Baz: www.baz.com
J'ai eu une recherche par le biais de la YAML spec, et ne pouvait pas trouver quoi que ce soit, je crois que la réponse est "non vous ne pouvez pas faire cela". Mais si quelqu'un a des idées, ce serait génial.
EDIT: Depuis, il ya eu pas de réponses, je suis en supposant que personne n'a repéré quelque chose que je n'ai pas dans le fichier YAML spec et que cela ne peut pas être fait à la YAML couche. Je suis donc l'ouverture de la question à l'idée de post-traitement du YAML pour aider à cela, dans le cas où quelqu'un trouve cette question à l'avenir.
- Remarque: Ce problème peut aussi être abordées dans la norme d'utilisation des Ancres et des Alias en YAML. Voir aussi: Comment faire pour fusionner les DONNÉES des tableaux?
Vous devez vous connecter pour publier un commentaire.
La fusion type de clé est probablement ce que vous voulez. Il utilise un
<<
clé de mappage pour indiquer la fusion, permettant un alias à un mapping (ou une séquence de ce type d'alias) pour être utilisé comme un initialiseur de fusionner en une seule cartographie. En outre, vous pouvez toujours remplacer explicitement des valeurs, ou ajouter d'autres qui n'étaient pas présents dans la liste de fusion.Il est important de noter que cela fonctionne avec les mappages, pas de séquences comme premier exemple. Cela a un sens quand vous pensez à ce sujet, et votre exemple dirait qu'il n'a probablement pas besoin d'être séquentielle de toute façon. Il suffit de changer votre séquence de valeurs de la cartographie des clés devrait faire l'affaire, comme dans l'exemple suivant (non testé) exemple:
Certaines choses à remarquer. Tout d'abord, depuis
<<
est une clé, il ne peut être spécifiée qu'une fois par nœud. Deuxièmement, lors de l'utilisation d'une séquence selon la valeur, l'ordre est important. Ce n'est pas grave dans l'exemple ici, car il n'y a pas de valeurs associées, mais il vaut la peine d'être conscient.yaml.load(...)
en Python, je reçois un dictionnaire comme la représentation d'une YAML cartographie. Oui, il est facile de post-traitement que dans un ensemble, mais je sais que c'est arrivé (et la sémantique de la complexité lors de la lecture/écriture des fichiers de configuration est beaucoup plus élevé si la règle est "jeux sont écrites sous forme de cartes avec des valeurs null"). Étant donné que j'ai besoin d'un post-traitement entreyaml.load(...)
et en utilisant les données obtenues si je utiliser<<
ouMERGE
, je vais probablement s'en tenir àMERGE
(que j'ai déjà mises en œuvre maintenant).!!set
notation. Un Python de mise en œuvre devraient soutenir les jeux en mode natif. PythonTagScheme regarde instructif.!!set
œuvres. Trop obscur réutilisable si. Ces fichiers sont mis à l'être humain accessible en lecture/écriture, par des gens qui ne sont pas nécessairement YAML experts. Les gens vont écrire leurs listes de sites en YAML listes, alors souhaitez les fusionner et convertir le tout pour un ensemble ET n'oubliez pas explicitement le tag ' un ensemble... j'ai un couple de d'autres standardisé de post-traitement les choses avecMERGE
de toute façon. Merci pour votre aide bien!Comme les réponses précédentes l'ont souligné, il n'existe pas de prise en charge intégrée pour l'extension de listes en YAML. Je vous propose encore une autre façon de mettre en œuvre vous-même. Considérez ceci:
Ceci sera traité dans:
L'idée est de fusionner le contenu de la clé se terminant par un " + "de la touche correspondante sans un"+". Je l'ai fait en Python et publié ici.
Profitez-en!
sites
etsites+
. Je veux dire un outil qui doit être mis en œuvre par l'utilisateur comme ce n'est pas un défautyaml
comportement?Clarifier quelque chose à partir de deux réponses ici, ce n'est pas pris en charge directement dans le format YAML pour les listes (mais il est pris en charge pour les dictionnaires, voir kittemon de réponse).
(Pour répondre à ma propre question dans le cas où la solution que j'utilise est utile pour toute personne qui cherche pour cela à l'avenir)
Avec aucune pur-YAML façon de le faire, je vais mettre en œuvre la présente comme une "syntaxe de transformation de la" assis entre le YAML analyseur et le code qui utilise le fichier de configuration. Donc, mon application de base n'ont pas à s'inquiéter à propos de tout homme convivial licenciement-mesures d'évitement, et peut seulement agir directement sur les structures.
La structure, je vais utiliser ressemble à ceci:
Qui serait transformé pour l'équivalent de:
Ou, avec les cartes:
Serait transformé:
Plus formellement, après l'appel de l'analyseur syntaxique YAML pour obtenir des objets natifs à partir d'un fichier de config, mais avant de passer les objets pour le reste de l'application, ma demande va à pied à l'objet graphique à la recherche pour les mappages contenant la clé unique
MERGE
. La valeur associée àMERGE
doit être une liste de listes, ou une liste de cartes; de toute autre sous-structure est une erreur.Dans la liste de listes de cas, la totalité de la carte contenant
MERGE
sera remplacé par l'enfant des listes concaténées dans l'ordre où elles apparaissent.Dans la liste de cartes cas, la totalité de la carte contenant
MERGE
sera remplacée par une carte unique contenant toutes les paires clé/valeur dans l'enfant des cartes. Où il y a des chevauchements dans les touches, la valeur de l'enfant de la carte survenant dans le dernierMERGE
liste sera utilisée.Les exemples donnés ci-dessus ne sont pas très utile, car vous pouvez avoir écrit la structure souhaitée directement. Il est plus susceptible d'apparaître:
Vous permettant de créer une liste ou d'une carte contenant tout ce qui dans les nœuds
salt
etpepper
être utilisé ailleurs.(Je continue à donner que
foo:
externe de la carte pour montrer queMERGE
doit être le seulement clé dans sa cartographie, ce qui signifie queMERGE
ne peut pas apparaître comme un haut-niveau ce nom si il n'y a pas de haut niveau d'autres noms)À dos de Kittemon réponse, notez que vous pouvez créer des mappages avec des valeurs null à l'aide de la syntaxe alternative
au lieu de l'a suggéré la syntaxe
Comme Kittemon de la suggestion, ce qui vous permettra d'utiliser des références à des points d'ancrage au sein de la cartographie et d'éviter la séquence en question. Je me suis retrouvé à devoir faire cela après avoir découvert que le Symfony composant Yaml v2.4.4 ne pas recorgnize la
? bar
syntaxe.