[英]With Python ruamel.yaml, lost anchor when loading in round-trip mode?
[英]How to properly set up YAML flow style dumping using round-trip with ruamel.yaml?
我正在使用 ruamel.yaml 包,但似乎無法以格式良好的流樣式輸出它。 我想將元素保持在同一級別,用尾隨逗號和換行符分隔。 我也想保留每一條評論,似乎有些在轉換為流樣式后消失了。 下面是一個例子:
background_opacity: 0.9 # comment
cursor: {style: Beam}
# comment
font:
normal: {family: Fira Code, style: Retina} # comment
size: 12.0 # comment
{
background_opacity: 0.9, # comment
cursor: {style: Beam},
# comment
font: {
normal: {family: Fira Code, style: Retina}, # comment
size: 12.0 # comment
}
}
{background_opacity: 0.9 # comment
, cursor: {style: Beam}, font: {normal: {family: Fira Code, style: Retina} # comment
, size: 12.0 # comment
}}
我的代碼附在下面。 我對 YAML 和 ruamel.yaml 很陌生,所以我為任何簡單的錯誤道歉。
from ruamel.yaml import YAML
def round_trip(sout, sin, idt):
yaml = YAML()
assert idt >= 2
yaml.indent(mapping=idt, sequence=idt, offset=idt-2)
yaml.preserve_quotes = True
data = yaml.load(sin)
if data is not None:
data.fa.set_flow_style() # needs fixing: commas are not trailing
yaml.dump(data, sout)
else:
print("the file is empty") # needs fixing: should dump original file
您似乎沒有做錯任何事情,但是 ruamel.yaml 不支持進行這種輸出。 它只是試圖在一行中填充盡可能多的流樣式,而你得到換行符是因為輸出注釋(與它們之前的映射鍵相關聯,強制這樣的換行符。
如果您的輸入沒有任何注釋,那么根據您設置的輸出寬度,您最終會得到一兩行。
如果您在加載時向每一行附加一個虛擬注釋,並在轉儲后刪除它,您可能會得到稍微好一點的結果,但這仍然不會讓您在自己的一行上打開大括號。
當前,您只設置根級別的樣式屬性,該屬性“有效”,因為您沒有嵌套的塊樣式集合。 您應該使用以下內容遞歸地執行此操作:
def set_style(d, flow):
if isinstance(d, dict):
if flow:
d.fa.set_flow_style()
else:
d.fa.set_block_style()
for k in d:
set_style(d[k], flow)
elif isinstance(d, list):
if flow:
d.fa.set_flow_style()
else:
d.fa.set_block_style()
for item in d:
set_style(item, flow)
data = yaml.load(sin)
set_style(data, flow=True)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.