问题描述
pyyaml似乎实现了一部分,该允许将很多不同的值解释为true或false:
典范:
y|n
正则表达式:
y|Y|yes|Yes|YES|n|N|no|No|NO
|true|True|TRUE|false|False|FALSE
|on|On|ON|off|Off|OFF`
>>> for k in "y|Y|yes|Yes|YES|n|N|no|No|NO|true|True|TRUE|false|False|FALSE|on|On|ON|off|Off|OFF".split("|"):
... print k, yaml.safe_load(k)
...
y y
Y Y
yes True
Yes True
YES True
n n
N N
no False
No False
NO False
true True
True True
TRUE True
false False
False False
FALSE False
on True
On True
ON True
off False
Off False
OFF False
并且将它们序列化为true
或false
(与YAML 1.1的规范y
和n
相反):
>>> yaml.safe_dump(dict(x=True, y=False))
'{x: true, y: false}\n'
有什么方法可以覆盖它,以便仅将规范的true
和false
值解释为布尔值?
1楼
您应该执行以下操作以使PyYAML不将那些字符串识别为布尔值:
替换在添加了添加隐解析器
resolver.py
,并且在缺省情况如下:Resolver.add_implicit_resolver( u'tag:yaml.org,2002:bool', re.compile(ur'''^(?:yes|Yes|YES|no|No|NO |true|True|TRUE|false|False|FALSE |on|On|ON|off|Off|OFF)$''', re.X), list(u'yYnNtTfFoO'))
您将必须跟踪
add_implicit_resolver
以查看它在何处添加内容,因为没有remove_implicit_resolver
。 或者,定义一个完整的新ResolverBase
子类,该子类可以执行Resolver
所有工作,但不具有上述的2002:bool
定义,但具有受限制的(1.2)版本。更新
bool_values
的类属性SafeConstructor
在constructor.py
这并不能使PyYAML 1.2兼容,因为还有更多,而且PyYAML并未完全实现YAML 1.1规范。
将YAML加载到python中并且没有将Yes解释为布尔值的最简单方法是使用ruamel.yaml而不是PyYAML(免责声明:我是该软件包的作者)。 在其源代码中,您还可以找到如果文件被标记为YAML 1.1(如果没有标记ruamel.yaml假定为1.2版)则如何保持解析器1.1的兼容性。