为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 yaml 无法按预期加载值?

为什么 yaml 无法按预期加载值?

翻过高山走不出你 2023-04-25 16:59:58
我用下一个最小的例子来解释我的问题:test.py#! /usr/bin/python3import jinja2import yamlfrom yaml import CSafeLoader as SafeLoaderdevices = [    "usb_otg_path: 1:8",    "usb_otg_path: m1:8",    "usb_otg_path: 18",]for device in devices:    template = jinja2.Template(device)    device_template = template.render()    print(device_template)    obj = yaml.load(device_template, Loader=SafeLoader)    print(obj)运行结果为:root@pie:~# python3 test.pyusb_otg_path: 1:8{'usb_otg_path': 68}usb_otg_path: m1:8{'usb_otg_path': 'm1:8'}usb_otg_path: 18{'usb_otg_path': 18}您可以查看 的值是否device_template为usb_otg_path: 1:8,然后 之后yaml.load变为,看起来像因为我们在其中。但其他 2 个输入没问题。1:868:你知道上面是一个复杂系统的简化,其中"usb_otg_path: 1:8"是我无法更改的输入值,也是yaml.load它用于将字符串更改为 python 对象的基本机制。然后,如果可能的话,我可以做{'usb_otg_path': '1:8'}一些小的改变(我们需要向上游到那个项目,所以可能不能做大的改变来影响其他人)?诸如更改任何参数yaml.load或其他内容之类的东西?
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

YAML 允许数字文字(标量)格式化为x:y:z并将它们解释为“六十进制”,也就是说:基数 60。

1:8因此被 YAML 解释为1*60**1 + 8*60**0,显然给了你68

值得注意的是,您还有m1:8一个字符串和18一个数字。你听起来像你想要所有的字符串?这个答案可能有用:

yaml.load(yaml, Loader=yaml.BaseLoader)

这会禁用自动值转换,因为 BaseLoader“不解析或支持任何标签,只构造基本的 Python 对象:列表、字典和 Unicode 字符串。”


查看完整回答
反对 回复 2023-04-25
  • 1 回答
  • 0 关注
  • 79 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信