Python 代码:
import yaml
data = {1}
print(yaml.dump(data))
打印:
!!set
1: null
是否可以做出这样的输出:
!!set
? 1
我认为我们应该能够做到,因为这段代码:
import yaml
print(yaml.safe_load("""
!!set
? 1"""))
打印:
{1}
由于集合只是 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