2017-02-17 3 views
3

Es ist möglich, mehrere Elemente in YAML-Datei mit identischen Attributen zu tun, aber ohne sie tatsächlich zu duplizieren?
Zum Beispiel habe ich:zwei Elemente mit den gleichen Attributen in YAML

item1: 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: 
    the_same_as_in_item1 

Wie kann ich angeben, dass item1 und item2 sind die gleichen Attribute haben? Am Ende möchte ich:

item1[it_one][some] 
item2[it_one][some] 

mir identisch Ergebnis.

Antwort

1

Der Mechanismus in YAML, der Ihnen helfen könnte, verwendet anchors and aliases. Bei denen muss man allerdings aufpassen, denn beim Alias ​​eines YAML-Mappings (geladen als Python dict) erhält man die gleiche Instanz des dict an item1 und item2 angehängt.

Wenn das nicht das ist, was Sie wollen, gibt es eine spezifische Interpretation eines Alias ​​in Form einer merge key. So verwenden Sie festlegen, dass ein Schlüssel <<:

item1: &repl 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: 
    <<: *repl 

das Sie geben, zumindest unmittelbar unter item2 einen neuen dict mit den gleichen Schlüssel/Werte wie für item1 (d Tasten it_one, it_two). Jedoch sind die Werte für diese Schlüssel (some: {}) aufgrund der Art und Weise, wie diese intern geladen und behandelt werden, dasselbe Objekt.

Wenn diese Art von Objekt Wiederverwendung problematisch ist, sollten Sie besser Stick mit einer nicht-merge Verwendung des Alias:

item1: &repl 
    it_one: 
     some: {...} 
    it_two: 
     somemore: {...} 
item2: *repl 

und zu Fuß über den Baum rekursiv die Schlüsselwerte in neuen dicts (und Listen duplizieren).

Bitte beachten Sie, dass, wenn Sie die round_trip_loader in ruamel.yaml verwenden, Sie sogar alles teilen, auch wenn Sie Merge-Schlüssel verwenden. Ohne dass eine Rundauslösung nicht möglich wäre, verwenden Sie stattdessen die safe_loader.

+0

Vielen Dank, es ist genau das, was ich gesucht habe! – Andreios

Verwandte Themen