Ich mache einige Beispiele zur Referenz.
import yaml
main_yaml = """
Package:
- !include _shape_yaml
- !include _path_yaml
"""
_shape_yaml = """
# Definieren
Rechteck: &id_Rectangle
name: Rechteck
breite: &Rectangle_width 20
höhe: &Rectangle_height 10
fläche: !product [*Rectangle_width, *Rectangle_height]
Kreis: &id_Circle
name: Kreis
radius: &Circle_radius 5
fläche: !product [*Circle_radius, *Circle_radius, pi]
# Einstellen
Form:
eigenschaft: *id_Rectangle
farbe: rot
"""
_path_yaml = """
# Definieren
Root: &BASE /path/src/
Pfade:
a: &id_path_a !join [*BASE, a]
b: &id_path_b !join [*BASE, b]
# Einstellen
Pfad:
eingabedatei: *id_path_a
"""
# benutzerdefinierten Tag-Handler definieren
def yaml_import(loader, node):
other_yaml_file = loader.construct_scalar(node)
return yaml.load(eval(other_yaml_file), Loader=yaml.SafeLoader)
def yaml_product(loader, node):
import math
list_data = loader.construct_sequence(node)
result = 1
pi = math.pi
for val in list_data:
result *= eval(val) if isinstance(val, str) else val
return result
def yaml_join(loader, node):
seq = loader.construct_sequence(node)
return ''.join([str(i) for i in seq])
def yaml_ref(loader, node):
ref = loader.construct_sequence(node)
return ref[0]
def yaml_dict_ref(loader: yaml.loader.SafeLoader, node):
dict_data, key, const_value = loader.construct_sequence(node)
return dict_data[key] + str(const_value)
def main():
# den Tag-Handler registrieren
yaml.SafeLoader.add_constructor(tag='!include', constructor=yaml_import)
yaml.SafeLoader.add_constructor(tag='!product', constructor=yaml_product)
yaml.SafeLoader.add_constructor(tag='!join', constructor=yaml_join)
yaml.SafeLoader.add_constructor(tag='!ref', constructor=yaml_ref)
yaml.SafeLoader.add_constructor(tag='!dict_ref', constructor=yaml_dict_ref)
config = yaml.load(main_yaml, Loader=yaml.SafeLoader)
pk_shape, pk_path = config['Package']
pk_shape, pk_path = pk_shape['Form'], pk_path['Pfad']
print(f"Form Name: {pk_shape['eigenschaft']['name']}")
print(f"Form Fläche: {pk_shape['eigenschaft']['fläche']}")
print(f"Form Farbe: {pk_shape['farbe']}")
print(f"Eingabedatei: {pk_path['eingabedatei']}")
if __name__ == '__main__':
main()
output
Form Name: Rechteck
Form Fläche: 200
Form Farbe: rot
Eingabedatei: /path/src/a
Update 2
und Sie können es kombinieren, wie folgt
# xxx.yaml
CREATE_FONT_PICTURE:
PROJECTS:
SUNG: &id_SUNG
name: SUNG
arbeitsverzeichnis: SUNG
ausgabe_verzeichnis: temp
schrift_pixel: 24
DEFINIEREN: &id_define !ref [*id_SUNG] # Sie können config['CREATE_FONT_PICTURE']['DEFINE'][name, work_dir, ... font_pixel] verwenden
AUTO_INIT:
dateinamensuffix: !dict_ref [*id_define, name, !product [5, 3, 2]] # SUNG30
# Dies ist nicht korrekt.
# basename_suffix: !dict_ref [*id_define, name, !product [5, 3, 2]] # Es wird Deep-Level erstellt. id_define ist Deep-Level: 2. Daher müssen Sie es nach dem 2. einfügen. Andernfalls kann nicht auf den korrekten Wert verwiesen werden.
2 Stimmen
Ich bin kürzlich auf HiYaPyCo für Python gestoßen, das genau das macht. Sie können verschiedene YAML-Dateien zusammenführen. Es ist ein sehr schönes Python-Modul, das es wert ist, es zu kennen.
0 Stimmen
Siehe auch: stackoverflow.com/questions/41620674/use-placeholders-in-yaml