使用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>