【问题标题】:problem with type conversion using yaml/oyaml使用 yaml/oyaml 的类型转换问题
【发布时间】:2019-07-17 08:19:01
【问题描述】:

我有一个包含以下行的 YAML 文件:

景点:

VT CODE : 0210

如果我使用 yaml.safe_load 读取此文件并在之后转储它,我会得到:

景点:

VT Code : 136

我知道我可以使用引号将 0210 标记为字符串,但我想知道为什么 yaml 会这样。

如果尝试:

print (int('0210'))

我得到 210

所以我认为必须有更多的纯类型转换

【问题讨论】:

  • 0210 和 136 都只是相同数字的表示。 Python 将带有前导 0 的数字视为基数 8(或 python 2,python3 会引发语法错误并需要 0o 作为前缀)。你希望它是一个数字还是一个字符串?

标签: python python-3.x yaml


【解决方案1】:

以零开头的整数字面量是 YAML 中基于 on the spec herethe quick reference card here 的八进制字面量。

如果您愿意,可以查看the PyYAML implementation parsing integer nodes here

作为某种证明,这里是您看到的 136 表示 Python 如何表示八进制,带有 0o 前缀。

>>> oct(136)
'0o210'

【讨论】:

  • 谢谢,我可以告诉 yaml 在不破解 yaml 代码的情况下将它们视为字符串或 int 吗?
  • 您指向 YAML 1.2 规范的链接说 0o14 是有效整数,YAML 1.1 Spec014 是有效整数,所以规范可能已更改。
  • @Bruno 由于您使用的是 PyYAML,您当然可以在您自己的 Constructor 子类中覆盖 construct_yaml_int 的实现,您可以将其组合成一个加载器 á la github.com/yaml/pyyaml/blob/master/lib3/yaml/loader.py ,但是请注意,您不再在技术上解析 YAML,而是您自己的方言 :)
猜你喜欢
  • 2011-11-17
  • 1970-01-01
  • 2023-03-18
  • 2012-10-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多