2016-09-15 52 views
0

我有這個YAML:如何在YAML中使用參考?

app_name: my_app 
version: 
    1.0: 
    path: /my_app/1.0 
    2.0: 
    path: /my_app/2.0 

是否有可能以某種方式避免打字「my_app應用」和它的版本,並改爲從YAML自身通過使用某種參考的?

我腦子裏想的是這樣的:

app_name: my_app 
version: 
    1.0: 
    path: /@app_name/$key[-1] 
    2.0: 
    path: /@app_name/$key[-1] 

最後,我打算讀入一個Python字典這一點。

+0

似乎沒有必要執行'@ 1.0',假設'@key [-1]'表示將此值與此值相關聯一級。 (如果@key [0]意味着'路徑') – Anthon

+0

是的,我改變了一下我的僞碼。 – fredrik

回答

1

在YAML中沒有對標量子串進行替換的機制,最好的是錨和別名,它們指的是整個標量或集合(映射,序列)。

如果你想這樣做,你將有解析在YAML,解釋各種值和重建的數據結構後做替換這樣的事情。

有幾個例子(包括這裏關於[所以])替代,其中YAML的一些部分被用作字典替換其他部分。當你這樣做的時候,你可以解析一次YAML輸入,替換源代碼,並重新解析該替換的輸出。 由於您使用相對引用,這不適合您,您需要在解析樹中進行替換。 另一種方法是修改解析器以從輸入中去除@並在運行中執行此操作。

在這兩種情況下,這將是一個壞主意,使用相同的標記(@)用於標記一鍵「存儲」它的價值(@app_name),以及標誌着鍵存儲密鑰本身(@1.0)並使用相關的值(您以兩種完全不同的方式使用@app_name@key[-1])。

+0

謝謝。我可能會使用[PyYAML別名](http://pyyaml.org/wiki/PYYAMLDocumentation#Aliases)或[jsonref](https://pypi.python.org/pypi/jsonref)(這意味着使用JSON代替的YAML),儘管我必須自己做一些解析和替換才能獲取版本號。我改變了我的僞代碼,因爲我同意你對我如何使用'@'的評論。 – fredrik

+0

我忘記提及的一點是'@'是一個保留字母,並且一個以它開始的標量需要被引用。用'$'來引入一個函數(帶'參數的''key')似乎更自然。如果你打算(也)破解解析器,那麼請看看['ruamel.yaml'](https://pypi.python.org/pypi/ruamel.yaml/)(免責聲明:我是作者) ,它比PyYAML有許多優點,包括支持YAML 1.2並被維護。 – Anthon