如何让Python中`yaml.dump({1})`输出“? 1”而不是“1: null”?

问题描述 投票:0回答:1

Python 代码:

import yaml

data = {1}

print(yaml.dump(data))

打印:

!!set
1: null

是否可以做出这样的输出:

!!set
? 1

我认为我们应该能够做到,因为这段代码:

import yaml

print(yaml.safe_load("""
!!set 
? 1"""))

打印:

{1}
python yaml set pyyaml
1个回答
0
投票

由于集合只是 YAML 中带有空值的映射,因此您可以通过重写

yaml.emitter.Emitter.expect_block_mapping
(映射事件的块式发射器)来自定义集合对象的输出,其逻辑与中的常规映射事件处理程序类似。
expect_block_mapping_key
方法,但强制非简单键输出输出
?
指示符,然后强制值状态处理程序直接移至键状态处理程序以避免输出
null
值:

class SetDumper(yaml.Dumper):
    def expect_block_mapping(self):
        super().expect_block_mapping()
        if self.event.tag == 'tag:yaml.org,2002:set':
            self.state = self.expect_first_block_set_key

    def expect_first_block_set_key(self):
        return self.expect_block_set_key(first=True)

    def expect_block_set_key(self, first=False):
        if not first and isinstance(self.event, yaml.MappingEndEvent):
            self.indent = self.indents.pop()
            self.state = self.states.pop()
        else:
            self.write_indent()
            self.write_indicator('?', True, indention=True)
            self.states.append(self.expect_block_set_value)
            self.expect_node(mapping=True)

    def expect_block_set_value(self):
        self.state = self.expect_block_set_key

这样:

import sys

yaml.dump({1: {1, 2}, 2: {3, 4}}, sys.stdout, Dumper=SetDumper)

输出:

1: !!set
  ? 1
  ? 2
2: !!set
  ? 3
  ? 4

演示:https://replit.com/@blhsing1/PrettyGoldRelationaldatabase

© www.soinside.com 2019 - 2024. All rights reserved.