YAML:挪威问题 (2022)
YAML 存在“挪威问题”,即当 YAML 解析器遇到“NO”(挪威的 ISO 3166-1 ALPHA-2 代码)时,会将其错误地解析为布尔值 `false`。这源于 YAML 对布尔值的宽松定义,允许多种字符串形式表示真假。文章指出,解决办法是使用双引号转义这些值,或使用如 Python 的 StrictYAML 库,避免这种隐式转换。此外,以 `.0` 结尾的版本号和 `Null` 等也可能导致类似问题。
本周早些时候,Haroen Viaene 在 Twitter 上发布了关于 YAML 的一条推文:
YAML 最糟糕的部分:https://yaml.org/type/bool.html — Haroen Viaene (@haroenv) 2022 年 1 月 10 日
链接的页面包含了 YAML 中布尔值的定义文档,详细说明了可以使用以下[regex]*进行解析:
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF
~
在某些情况下,这会带来问题的原因是“挪威问题”。当您将挪威缩写为其 ISO 3166-1 ALPHA-2 形式 NO
时,YAML 在解析时会返回 false
:
countries:
- GB
- IE
- FR
- DE
- NO
>>> from pyyaml import load
>>> load(the_configuration)
{'countries': ['GB', 'IE', 'FR', 'DE', False]}
👉 解决方案是使用双引号转义这些值,或者使用一个库(例如 Python 的 StrictYAML),它不会将 NO
转换为 False
。
~
YAML 中其他有问题的数值包括以 .0
结尾的版本号和诸如 Null
的姓氏。默认情况下,它们分别会被转换为数字或 NULL
。
* [regex]: 正则表达式