如何让Python中yaml.dump({1})输出"? 1"而非"1: null"?
问题
执行以下Python代码:
import yaml data = {1} print(yaml.dump(data))
得到的输出是:
!!set 1: null
能否让输出变为:
!!set ? 1
我认为这应该可以实现,因为执行以下代码:
import yaml print(yaml.safe_load(""" !!set ? 1"""))
输出结果是:
{1}
解决方案
可以通过自定义YAML的Representer实现这种输出格式。PyYAML默认会把集合(set)元素以key: null的形式序列化,我们可以重写集合的表示逻辑,让它使用? key的格式输出。
具体代码如下:
import yaml def represent_set(dumper, data): return dumper.represent_mapping('tag:yaml.org,2002:set', {item: None for item in data}, flow_style=False) # 注册自定义表示器 yaml.add_representer(set, represent_set) # 测试 data = {1} print(yaml.dump(data))
执行这段代码后,输出会变成:
!!set ? 1
原理说明:
- 重写
set类型的YAML表示器,序列化时调用represent_mapping方法,并传入flow_style=False生成块级格式输出。 - 内部虽仍使用
{item: None}的结构,但PyYAML会自动将值为None的映射项简化为? item的形式,匹配预期输出。
内容的提问来源于stack exchange,提问作者Osama Adel
相关产品推荐
相关产品推荐

