J'ai le YAML suivant:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Comment puis-je "normaliser" cela, en supprimant /path/to/root/
des trois chemins, et en le définissant comme son propre paramètre, quelque chose comme:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Évidemment, c'est invalide, je viens de l'inventer. Quelle est la vraie syntaxe? Cela peut-il être fait?
syntax
yaml
transclusion
Andrew Bullock
la source
la source
Réponses:
Je ne pense pas que ce soit possible. Vous pouvez réutiliser le "nœud" mais pas une partie de celui-ci.
C'est YAML et les champs parfaitement valides
given
etfamily
sont réutilisés enship-to
bloc. Vous pouvez réutiliser un nœud scalaire de la même manière, mais il n'y a aucun moyen de changer ce qu'il y a à l'intérieur et d'y ajouter cette dernière partie d'un chemin depuis l'intérieur de YAML.Si la répétition vous dérange autant, je suggère de rendre votre application consciente de la
root
propriété et de l'ajouter à chaque chemin qui semble relatif et non absolu.la source
root
code. pas grand chose.Oui, en utilisant des balises personnalisées. Exemple en Python, permettant à la
!join
balise de joindre des chaînes dans un tableau:Ce qui se traduit par:
Le tableau d'arguments de
!join
peut avoir n'importe quel nombre d'éléments de n'importe quel type de données, tant qu'ils peuvent être convertis en chaîne, il en!join [*a, "/", *b, "/", *c]
va de même pour ce que vous attendez.la source
python3
?) Cependant, avec une simple modification de ce qui précède, cela 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 d'utiliser simplement un autre champ.
la source
Définition YML:
Quelque part dans la feuille de thym
Sortie: / home / data / in / / home / data / in / p1
la source
J'ai créé une bibliothèque, disponible sur Packagist, qui remplit cette fonction: https://packagist.org/packages/grasmash/yaml-expander
Exemple de fichier YAML:
Exemple de logique:
Tableau résultant:
la source
Dans certains langages, vous pouvez utiliser une bibliothèque alternative.Par exemple, tampax est une implémentation de variables de gestion YAML:
la source
Votre exemple n'est pas valide uniquement parce que vous avez choisi un caractère réservé pour commencer vos scalaires. Si vous remplacez le
*
par un autre caractère non réservé (j'ai tendance à utiliser des caractères non ASCII pour cela car ils sont rarement utilisés dans le cadre de certaines spécifications), vous vous retrouvez avec un YAML parfaitement légal:Cela se chargera dans la représentation standard des mappages dans le langage utilisé par votre parseur et n'étend rien par magie.
Pour ce faire, utilisez un type d'objet par défaut localement comme dans le programme Python suivant:
qui imprimera:
Le développement se fait à la volée et gère les définitions imbriquées, mais vous devez faire attention à ne pas invoquer une récursivité infinie.
En spécifiant le dumper, vous pouvez vider le YAML d'origine à partir des données chargées, en raison de l'extension à la volée:
cela changera l'ordre des clés de mappage. Si cela pose un problème, vous devez créer
self.d
unCommentedMap
(importé deruamel.yaml.comments.py
)la source
J'ai écrit ma propre bibliothèque sur Python pour développer les variables chargées à partir de répertoires avec une hiérarchie comme:
La principale différence ici est que l'expansion doit être appliquée uniquement après le
config.yaml
chargement de tous les fichiers, où les variables du fichier suivant peuvent remplacer les variables du précédent, le pseudocode devrait donc ressembler à ceci:Comme option supplémentaire, le
xonsh
script peut exporter les variables résultantes dans des variables d'environnement (voir layaml_update_global_vars
fonction).Les scripts:
https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/cmdoplib.yaml.py https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts /Outils/cmdoplib.yaml.xsh
Avantages :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
)\\
à/
une variable de chemin (${env:MYVAR:path}
)Inconvénients :
${MYSCOPE.MYVAR}
n'est pas implémenté)la source
Avec Yglu , vous pouvez écrire votre exemple comme suit :
Avertissement: je suis l'auteur de Yglu.
la source