【问题标题】:How to suppress automatic quoting of strings with ruamel.yaml如何使用 ruamel.yaml 抑制字符串的自动引用
【发布时间】:2018-07-15 21:22:10
【问题描述】:

我正在使用 ruamel.yaml 为构建工具生成“配方”,该工具接受 yaml 的非标准超集。我得到了一些不受欢迎的输出,而我对如何禁用它的搜索已经枯竭。这是一个例子:

import ruamel.yaml as ryaml

test = ryaml.comments.CommentedMap(requirements={'host': ['abc', 'def   # [something]']})
print(ryaml.dump(test, Dumper=ryaml.RoundTripDumper,
                                            default_flow_style=False,
                                            default_style="",
                                            width=200))

这会自动引用无效 yaml 的内容(老实说,这是非常正常的默认行为):

requirements:
  host:
    - abc
    - 'def   # [something]'

我真的需要它不要在非标准行周围添加那些单引号。我不希望 ruamel 能够将其解析回来,只需将其转储即可。

【问题讨论】:

    标签: yaml ruamel.yaml


    【解决方案1】:

    您想要一个普通的标量,但该标量中的 #(空格后跟哈希)可以解释为注释。因此,需要引用该标量才能正确表示。如果您有 :(冒号 + 空格),也会发生同样的情况。

    您唯一能做的就是将值更改为例如'def _# [something]'

    这个对纯标量的限制是clearly documented in the specification

    (如果这是您的意图,您当然可以使用 ruamel.yaml 生成带注释的 YAML。但是您不能通过简单地在值中包含注释来做到这一点:没有办法区分来自包含字符空格+散列的真实值)

    【讨论】:

    • 我认为我们已经远远超出了保留,我们不能使用 ruamel.yaml 在这里转储。我们还有其他的东西,比如 jinja2 变量也得到了这种处理,所以我认为我们只需要一个糟糕的 hack 方法。无论如何,谢谢你的信息!
    • 从头开始添加 cmets 是可行的,但并非易事。如果您可以从模板开始,只需将一些键值对添加到映射并将元素添加到序列。这样,模板中的 cmets 将保留在转储中。 jinja2 也可以作为 extension 进行往返,您可以使用它来做类似的事情(但不是简单地添加新的 jinja2 构造。
    • 我已经成功申请的另一件事是得到 ruamel.yaml 无法按我想要的方式输出的东西,例如如果缩进必须有效,但不一致。就是输出一些特殊的字符序列,在dumping的时候替换掉。
    • 两个好主意。我最终写了一个蹩脚的递归字符串构建器,但如果/当这不可避免地不够时,我会用你的想法重新审视这个。
    猜你喜欢
    • 2017-10-02
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2021-10-11
    • 2013-07-04
    相关资源
    最近更新 更多