java yaml dump方法_如何配置ruamel.yaml.dump输出?

使用ruamel.yaml.dump()无法获得您想要的输出,而无需对内部进行重大修改。

您喜欢的输出对于顶级映射(键a,b等)的值具有缩进2,并且序列元素的缩进4是a键的值(推送了-)这至少需要对映射和序列的缩进级别(如果不是针对单个集合)进行区分,这是非平凡的。

您的序列输出将从,(逗号,空格)压缩为“正常”流式传输到,。 IIRC目前不能受任何参数的影响,并且由于您在发出集合时几乎没有上下文知识,因此很难“在发出作为关键的序列时不包括空格”。 dump()的附加选项需要更改几个源文件和类。

解决问题的难点问题:

您的元组必须神奇地转换为序列才能删除标签!!python/tuple。因为你不想影响所有元组,所以IMO最好通过创建tuple的子类并将其表示为一个序列(如果实际用作键,则可选地将这样的元组表示为列表)。您可以使用comments.CommentedKeySeq(假设ruamel.yaml>=0.12.14,它在使用ruamel.yaml.round_trip_dump()时具有正确的表示支持

你的钥匙是,在发射前测试时,不是一个简单的钥匙,因此得到一个'? '(问号,空格)表示复杂的映射关键字。 。您必须更改发射器,以便SequenceStartEvent启动一个简单的键(如果它具有流样式而不是块样式)。另一个问题是,这样的SequenceStartEvent将被“测试”以具有style属性(这可能表明在键上明确需要'?')。这需要更改emitter.py:Emitter.check_simple_key()和emitter.py:Emitter.expect_block_mapping_key()。

c的标量字符串值会获得引号,而b的标量字符串值则不会。你只能通过使它们成为不同的类型来获得ruamel.yaml中输出的那种差异。例如。通过输入scalarstring.SingleQuotedScalarString()(并使用round_trip_dump())。

如果你这样做:

import sys

import ruamel.yaml

from ruamel.yaml.comments import CommentedMap, CommentedKeySeq

assert ruamel.yaml.version_info >= (0, 12, 14)

data = CommentedMap()

data[CommentedKeySeq((2, 3, 4))] = cm = CommentedMap()

cm['a'] = [1, 2]

cm['b'] = 'Hello World!'

cm['c'] = ruamel.yaml.scalarstring.SingleQuotedScalarString('Voilà!')

ruamel.yaml.round_trip_dump(data, sys.stdout, explicit_start=True, version=(1, 2))你会得到:

%YAML 1.2

---

[2, 3, 4]:

a:

- 1

- 2

b: Hello World!

c: 'Voilà!'除了现在一致的缩进级别2之外,流式样序列中的额外空格以及round_trip_dump所需的使用将使您尽可能接近您想要的而无需重大返工。

上述代码是否丑陋当然是品味问题。

使用ruamel.yaml.round_trip_load(preserve_quotes=True)加载时,输出将非正常地正确往返。

如果不需要控制引号,并且映射键的顺序也不重要,那么您也可以修补普通的转储器:

def my_key_repr(self, data):

if isinstance(data, tuple):

print('data', data)

return self.represent_sequence(u'tag:yaml.org,2002:seq', data,

flow_style=True)

return ruamel.yaml.representer.SafeRepresenter.represent_key(self, data)

ruamel.yaml.representer.Representer.represent_key = my_key_repr然后你可以使用正常的序列:

data = {}

data[(2, 3, 4)] = cm = {}

cm['a'] = [1, 2]

cm['b'] = 'Hello World!'

cm['c'] = 'Voilà!'

ruamel.yaml.dump(data, sys.stdout, allow_unicode=True, explicit_start=True, version=(1, 2))会给你:

%YAML 1.2

---

[2, 3, 4]:

a: [1, 2]

b: Hello World!

c: Voilà!请注意,您需要使用allow_unicode=True在输出中明确允许unicode(默认为round_trip_dump())。

¹免责声明:我是ruamel.yaml的作者。 sub>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值