簡體   English   中英

如何使用往返 ruamel.yaml 正確設置 YAML 流樣式轉儲?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM