gpt4 book ai didi

python - yaml.load,将 dict 键强制转换为字符串

转载 作者:行者123 更新时间:2023-11-28 22:19:05 25 4
gpt4 key购买 nike

在 Python3 中,我正在加载一段 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,作为一个值,我需要一个数字。

所以我可以将键和值都强制为字符串,或者都没有。

我当然可以制作一个后处理器来遍历加载的数据并将其复制到一个新变量,并将 dict 键强制为字符串,但我想它可以在 YAML 加载器中完成得更优雅。

建议?

最佳答案

您可以使用几行代码来完成此操作,更改正在构造的每个映射,以将整数类型键动态转换为字符串。您可以子类化 SafeLoader,但是您需要注册构造函数。最简单的方法是只修补映射构造函数:

import yaml

def my_construct_mapping(self, node, deep=False):
data = self.construct_mapping_org(node, deep)
return {(str(key) if isinstance(key, int) else key): data[key] for key in data}

yaml.SafeLoader.construct_mapping_org = yaml.SafeLoader.construct_mapping
yaml.SafeLoader.construct_mapping = my_construct_mapping


yaml_str = """\
---
one: 1
2: two
"""

data = yaml.safe_load(yaml_str)
print(data)

给出:

{'one': 1, '2': 'two'}

没有理由使用默认的、不安全yaml.load()(即没有 Loader= 参数)。

关于python - yaml.load,将 dict 键强制转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50045617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com