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

我用下一个最小的例子来解释我的问题:


test.py


#! /usr/bin/python3


import jinja2

import yaml

from yaml import CSafeLoader as SafeLoader


devices = [

    "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.py

usb_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或其他内容之类的东西?


翻过高山走不出你
浏览 80回答 1
1回答

四季花海

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 字符串。”
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python