comment référencer un YAML “définition” d'ailleurs dans le même fichier YAML?
J'ai le YAML suivante:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Comment puis-je "normaliser", par la suppression /path/to/root/
de trois chemins, et de l'avoir comme sa propre situation, quelque chose comme:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Évidemment c'est non valide, j'ai juste fait. Quel est le réel de la syntaxe? Peut-il être fait?
- Voir aussi: stackoverflow.com/a/41620747/42223
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que c'est possible. Vous pouvez réutiliser le "nœud", mais n'en font pas partie.
Ce qui est parfaitement valide YAML et les champs
given
etfamily
sont réutilisés dansship-to
bloc. Vous pouvez réutiliser un scalaire nœud de la même manière, mais il n'y a aucun moyen que vous pouvez changer ce qui est à l'intérieur et d'ajouter que la dernière partie du trajet à partir de l'intérieur YAML.Si la répétition vous dérange pas que je vous suggérons de faire votre demande de conscience de
root
de la propriété et de l'ajouter à chaque chemin que semble relative, pas absolue.root
dans le code. pas trop grave.Oui, à l'aide de balises personnalisées. Exemple en Python, faisant de la
!join
tag rejoindre chaînes dans un tableau:Qui se traduit par:
Le tableau d'arguments à
!join
peut avoir un nombre quelconque d'éléments de tout type de données, tant qu'ils peuvent être convertis en chaînes de caractères, donc!join [*a, "/", *b, "/", *c]
est-ce que vous attendez.python3
?) cependant, avec une simple modification de ce qui précède, il fonctionne comme prévu. Plus précisément:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Une autre façon de voir cela est de simplement utiliser un autre champ.
YML définition:
Quelque part dans thymeleaf
De sortie:
/home/data/dans/
/home/data/dans/p1
J'ai créer une bibliothèque, disponible sur Packagist, qui exerce cette fonction:
https://packagist.org/packages/grasmash/yaml-expander
Exemple fichier YAML:
Exemple de logique:
Résultante de tableau:
Dans certaines langues, vous pouvez utiliser une autre bibliothèque, Par exemple, tampax est une implémentation de YAML la manipulation de variables:
Que votre exemple n'est pas valide est seulement parce que vous avez choisi d'un caractère réservé pour commencer votre scalaires avec. Si vous remplacez le
*
avec certains autres non-caractères réservés (j'ai tendance à utiliser des caractères non-ASCII pour ce qu'elles sont rarement utilisées dans le cadre de la spécification), vous vous retrouvez avec parfaitement légal YAML:Cela va charger dans la représentation standard pour les mappages dans la langue de votre analyseur utilise et n'a pas la baguette magique pour développer quoi que ce soit.
Pour ce faire utiliser localement un type d'objet par défaut comme dans l'exemple suivant programme en Python:
qui permet d'imprimer:
L'expansion se fait à la volée et les poignées imbriqués les définitions, mais vous devez être prudent de ne pas invoquer une récursion infinie.
En spécifiant le dumper, vous pouvez vider le original YAML à partir des données chargées dans, en raison de la sur-the-fly expansion:
cela va changer la clé de mappage de la commande. Si c'est un problème que vous avez
pour faire
self.d
unCommentedMap
(importé deruamel.yaml.comments.py
)