在Python3中,我正在加载一个YAML片段。 加载器试图猜测正确的类型,但我不太满意。 我希望字典键始终是字符串。
首先是一个最小化的YAML片段,可直接粘贴到您的Python解释器中进行演示。 不用说,我的现实世界数据要复杂得多。
现在所有的东西都被作为字符串处理。不幸的是,1 也是字符串,但我需要它作为一个数字值。所以我要么把键和值都强制转化为字符串,要么不转化。
当然,我可以创建一个后处理程序来遍历加载的数据并将其复制到一个新变量中,将字典键强制转化为字符串,但我认为这可以更优雅地在YAML加载器内部完成。有什么建议吗?
首先是一个最小化的YAML片段,可直接粘贴到您的Python解释器中进行演示。 不用说,我的现实世界数据要复杂得多。
txt = """
---
one: 1
2: two
"""
首先是“常规”负载:
yaml.load(txt)
{2: 'two', 'one': 1}
注意键2被加载为数字而不是字符串。现在让我们尝试一些不同的东西:
yaml.load(txt, Loader=yaml.BaseLoader)
{'2': 'two', 'one': '1'}
现在所有的东西都被作为字符串处理。不幸的是,1 也是字符串,但我需要它作为一个数字值。所以我要么把键和值都强制转化为字符串,要么不转化。
当然,我可以创建一个后处理程序来遍历加载的数据并将其复制到一个新变量中,将字典键强制转化为字符串,但我认为这可以更优雅地在YAML加载器内部完成。有什么建议吗?
SafeConstructor
进行子类化,在该子类上多次调用.add_constructor()
(参见constructor.py
),然后创建一个基于SafeLoader的加载器,该加载器使用该子类进行构造。使用我的ruamel.yaml库比PyYAML更容易实现,但仍需要大量代码。如果您遇到困难,请知道在哪里发布问题;-) - Anthon