Mam następujący YAML:
paths:
patha: /path/to/root/a
pathb: /path/to/root/b
pathc: /path/to/root/c
Jak mogę to „znormalizować”, usuwając /path/to/root/
z trzech ścieżek i mieć to jako własne ustawienie, na przykład:
paths:
root: /path/to/root/
patha: *root* + a
pathb: *root* + b
pathc: *root* + c
Oczywiście to nieważne, właśnie to wymyśliłem. Jaka jest prawdziwa składnia? Czy da się to zrobić?
syntax
yaml
transclusion
Andrew Bullock
źródło
źródło
Odpowiedzi:
Nie sądzę, żeby to było możliwe. Możesz ponownie użyć „węzła”, ale nie może być jego częścią.
Jest to całkowicie poprawne YAML i pola
given
ifamily
są ponownie wykorzystywane wship-to
bloku. Możesz ponownie użyć węzła skalarnego w ten sam sposób, ale nie ma możliwości zmiany tego, co jest w środku i dodania tej ostatniej części ścieżki do niego z wewnątrz YAML.Jeśli powtarzanie Ci tak bardzo przeszkadza, proponuję, aby Twoja aplikacja była świadoma
root
właściwości i dodała ją do każdej ścieżki, która wygląda na względną, a nie absolutną.źródło
root
kod w kodzie. Nic takiego.Tak, używając niestandardowych tagów. Przykład w Pythonie,
!join
łączenie ze znacznikiem ciągów znaków w tablicy:Co skutkuje w:
Tablica argumentów
!join
może zawierać dowolną liczbę elementów dowolnego typu danych, o ile można je przekonwertować na łańcuch, więc!join [*a, "/", *b, "/", *c]
robi to, czego można się spodziewać.źródło
python3
?) Jednak po prostej modyfikacji powyższego działa zgodnie z oczekiwaniami. W szczególności:yaml.SafeLoader.add_constructor(tag='!join', constructor=join)
yaml.load(open(fpth, mode='r'), Loader=yaml.SafeLoader)
Innym sposobem spojrzenia na to jest po prostu użycie innego pola.
źródło
Definicja YML:
Gdzieś w grasicy
Wyjście: / home / data / in / / home / data / in / p1
źródło
Utworzyłem bibliotekę, dostępną na Packagist, która spełnia tę funkcję: https://packagist.org/packages/grasmash/yaml-expander
Przykładowy plik YAML:
Przykładowa logika:
Wynikowa tablica:
źródło
W niektórych językach możesz użyć alternatywnej biblioteki, na przykład tampax jest implementacją zmiennych obsługujących YAML:
źródło
Twój przykład jest niepoprawny tylko dlatego, że wybrałeś zarezerwowany znak, aby rozpocząć skalary. Jeśli
*
zastąpisz znak innym niezastrzeżonym znakiem (zwykle używam do tego znaków innych niż ASCII, ponieważ rzadko są one używane jako część jakiejś specyfikacji), otrzymasz całkowicie legalny YAML:Spowoduje to załadowanie do standardowej reprezentacji mapowań w języku używanym przez parser i niczego w magiczny sposób nie rozszerzy.
Aby to zrobić, użyj lokalnie domyślnego typu obiektu, jak w następującym programie w języku Python:
który wydrukuje:
Rozwijanie jest wykonywane w locie i obsługuje zagnieżdżone definicje, ale musisz uważać, aby nie wywoływać nieskończonej rekurencji.
Określając zrzut, możesz zrzucić oryginalny YAML z załadowanych danych, ponieważ rozwija się w locie:
spowoduje to zmianę kolejności kluczy mapowania. Jeśli to jest problem, trzeba dokonać (importowane z )
self.d
CommentedMap
ruamel.yaml.comments.py
źródło
Napisałem własną bibliotekę w Pythonie, aby rozwinąć zmienne ładowane z katalogów z hierarchią, taką jak:
Kluczowa różnica polega na tym, że rozwinięcie należy zastosować dopiero po
config.yaml
załadowaniu wszystkich plików, gdzie zmienne z następnego pliku mogą nadpisać zmienne z poprzedniego, więc pseudokod powinien wyglądać następująco:Jako dodatkową opcję
xonsh
skrypt może eksportować wynikowe zmienne do zmiennych środowiskowych (patrzyaml_update_global_vars
funkcja).Skrypty:
https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools/cmdoplib.yaml.py https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts /Tools/cmdoplib.yaml.xsh
Plusy :
${MYUNDEFINEDVAR}
->*$/{MYUNDEFINEDVAR}
)${env:MYVAR}
)\\
na/
w zmiennej ścieżki (${env:MYVAR:path}
)Wady :
${MYSCOPE.MYVAR}
nie jest zaimplementowane)źródło
Z Yglu możesz zapisać swój przykład jako:
Zastrzeżenie: jestem autorem Yglu.
źródło