如何在PyYAML中覆盖Base Resolver?实现遇问题求助
解决PyYAML将
on解析为布尔值True的问题 你的代码无效是因为直接修改BaseResolver的隐式解析器不会影响已继承的FullLoader子类(即你的CustomLoader)。PyYAML的每个Loader类维护独立的解析器列表,必须直接在自定义Loader中修改布尔类型的解析规则。
正确实现步骤
- 自定义Loader继承自
FullLoader,先移除其中默认的布尔隐式解析器 - 添加新的布尔解析规则,排除
on/On/ON的匹配
修正后的代码
import yaml import re class CustomLoader(yaml.FullLoader): pass # 移除CustomLoader中默认的布尔隐式解析器 if 'tag:yaml.org,2002:bool' in CustomLoader.yaml_implicit_resolvers: CustomLoader.yaml_implicit_resolvers['tag:yaml.org,2002:bool'] = [] # 添加自定义布尔解析规则,排除on/On/ON CustomLoader.add_implicit_resolver( 'tag:yaml.org,2002:bool', re.compile( r'''^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |off|Off|OFF)$''', re.X ), list('yYnNtTfFoO') ) # 加载YAML文件 with open(file_path, 'r') as file: yaml_content = yaml.load(file, Loader=CustomLoader)
效果说明
使用这个自定义Loader解析你的YAML文件后,on会被保留为字符串键,不会被转换为True,解析结果与原YAML结构一致。
内容的提问来源于stack exchange,提问作者Diego
相关产品推荐
相关产品推荐

