我用下一个最小的例子来解释我的问题: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 字符串。”
添加回答
举报
0/150
提交
取消