【问题标题】:ruamel - block_seq_indent and indentruamel - block_seq_indent 和缩进
【发布时间】:2018-07-11 13:49:01
【问题描述】:

在使用yaml.round_trip_dump 后,我一直在努力让我的 YAML 文件具有正确的缩进。我试图弄清楚block_seq_indentindent 之间的区别。在文档中也找不到任何有用的东西。

【问题讨论】:

    标签: yaml ruamel.yaml


    【解决方案1】:

    indent 是 ruamel.yaml 从 PyYAML 继承的正常缩进。它影响映射键和序列元素。对于序列,这意味着它不会影响序列元素之前的哈希 ('-')。

    所以如果你运行:

    import sys
    import ruamel.yaml
    
    d = dict(a=1, b=[1, 2, {3: [3.1, 3.2, 3.3]}], c=dict(d=1, e=2))
    
    ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, explicit_start=True)
    ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, indent=4, explicit_start=True)
    

    输出将是:

    ---
    a: 1
    b:
    - 1
    - 2
    - 3:
      - 3.1
      - 3.2
      - 3.3
    c:
      d: 1
      e: 2
    ---
    a: 1
    b:
    -   1
    -   2
    -   3:
        -   3.1
        -   3.2
        -   3.3
    c:
        d: 1
        e: 2
    

    如果您还提供block_seq_indent,您可以这样做:

    ruamel.yaml.safe_dump(d, sys.stdout, default_flow_style=False, indent=4, 
                      block_seq_indent=3, explicit_start=True)
    

    得到:

    a: 1
    b:
       - 1
       - 2
       - 3:
           - 3.1
           - 3.2
           - 3.3
    c:
        d: 1
        e: 2
    

    要获得更多控制权,您应该使用新的ruamel.yaml API,您可以这样做:

    yaml = ruamel.yaml.YAML()
    yaml.indent(mapping=3, sequence=5, offset=2)
    yaml.explicit_start = True
    yaml.dump(d, sys.stdout)
    

    得到:

    a: 1
    b:
      -  1
      -  2
      -  3:
           -  3.1
           -  3.2
           -  3.3
    c:
       d: 1
       e: 2
    

    即您可以使用offset 将破折号定位在作为序列元素缩进的空格内。

    这是记录在here

    【讨论】:

    • 感谢您提供清晰的解释。由于某种原因,我无法导入 YAML()。这就是我正在做的事情:import ruamel.yaml yml =ruamel.yaml.YAML()。我收到此错误:AttributeError: 'module' object has no attribute 'YAML'
    • 另外,在使用 block_seq_indent=3 时,为什么“连字符”和序列值之间没有间距?
    • 你使用什么版本的 ruamel.yaml? yml = ruamel.yaml.YAML() 构造需要ruamel.yaml>0.14。您应该提供一个完整的问题(而不是评论),包括代码和输出到间距。
    • 关于间距,参考您提供的答案,具体是第三个输出。抱歉,如果之前不清楚。谢谢
    • 仍然不清楚:在我的所有输出示例中,连字符和元素之间都有一个空格(否则它不会是 YAML 序列)。你写“为什么我们没有间距”,这没有意义,也不能引用我的任何输出。
    猜你喜欢
    • 2020-09-22
    • 2019-04-27
    • 2020-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多