You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否默认将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集合:

  1. 自定义加载器类,重写construct_sequence方法
  2. 使用自定义加载器加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:42:07