能否默认将YAML文件中的列表直接解析为Python set?如何实现?
如何让PyYAML默认将YAML列表解析为Python集合(set)?
可以实现,无需加载后手动遍历转换,通过自定义PyYAML的加载器即可完成。
问题场景
当前使用PyYAML加载YAML文件时,列表会被默认解析为Python的list:
import yaml from yaml.loader import SafeLoader # Open the file and load the file with open('Userdetails.yaml') as f: data = yaml.load(f, Loader=SafeLoader) print(data)
默认输出:
{'User': ['user1', 'user2']}
期望直接得到集合类型的输出:
{'User': {'user1', 'user2'}}
实现方案
通过继承SafeLoader并重写序列(列表)的构造方法,让加载器自动将YAML列表转换为Python集合:
- 自定义加载器类,重写
construct_sequence方法 - 使用自定义加载器加载YAML文件
完整示例代码
首先是Userdetails.yaml的内容:
User: - user1 - user2
然后是Python代码:
import yaml from yaml.loader import SafeLoader class SetLoader(SafeLoader): def construct_sequence(self, node): # 调用父类方法获取列表,再转换为set返回 return set(super().construct_sequence(node)) # 注册自定义构造方法到加载器 SetLoader.add_constructor( yaml.resolver.BaseResolver.DEFAULT_SEQUENCE_TAG, SetLoader.construct_sequence ) with open('Userdetails.yaml') as f: data = yaml.load(f, Loader=SetLoader) print(data)
运行后输出:
{'User': {'user1', 'user2'}}
原理说明
PyYAML的加载器通过构造方法(constructor)处理不同类型的YAML节点,DEFAULT_SEQUENCE_TAG对应YAML的列表类型。我们重写construct_sequence方法,将原本返回list的逻辑改为返回set,从而实现默认解析为集合的效果。
内容的提问来源于stack exchange,提问作者dl.meteo
相关产品推荐
相关产品推荐

