如何防止 PyYAML 中八进制/十六进制/二进制到 Int 的隐式转换?

问题描述 投票:0回答:2

在 YAML 文件中,我希望用户仅输入十进制整数值。

YAML 文件中还有其他对象。但是,指定整数值时不带引号。所以,我只关心整数输入。

示例 YAML 文件:

DecimalsList:
- 34
- 0432   # PyYAML converts 0432 to 287 by interpreting this as octal.

我正在使用 yamlordereddictloader 在 python 脚本中读取此 YAML 文件

with open(yaml_file_path, 'r') as stream:
    yaml_object = yaml.load(stream,
                       Loader=yamlordereddictloader.Loader)

这会破坏我的应用程序逻辑,因为它与 YAML 文件中输入的值不匹配。

如果在此列表中输入小数以外的任何内容,我想抛出错误。

我怎样才能实现这个目标?

有没有办法通过 PyYAML 停止这种整数的隐式转换?

python python-3.x yaml pyyaml
2个回答
2
投票

可能有更好的方法来做到这一点,但一种方法是预处理 yaml 文件并使用正则表达式删除任何前导零:

import re

with open(yaml_file_path, 'r') as stream:
    stream = re.sub(r'\b0(\d+)\b', r'\1', stream.read())
    yaml_object = yaml.load(stream,
                       Loader=yamlordereddictloader.Loader)

0
投票

作为一种额外的可能性,您现在可以在 PyYAML 之上使用 yamlcore 来处理 YAML 1.2 文件。

>>> import yaml
>>> from yamlcore import CoreLoader
>>> yaml.load("[0432, 0o432]", Loader=CoreLoader)
[432, 282]

YAML 1.1 和 1.2 之间还有一些更多差异,如此处所示。

免责声明:我是 yamlcore 的作者,也是 PyYAML 的贡献者。

© www.soinside.com 2019 - 2024. All rights reserved.