当前位置: 代码迷 >> python >> 有什么方法可以覆盖pyyaml对布尔值的自由处理吗?
  详细解决方案

有什么方法可以覆盖pyyaml对布尔值的自由处理吗?

热度:51   发布时间:2023-06-16 10:26:19.0

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

并且将它们序列化为truefalse (与YAML 1.1的规范yn相反):

>>> yaml.safe_dump(dict(x=True, y=False))
'{x: true, y: false}\n'

有什么方法可以覆盖它,以便仅将规范的truefalse值解释为布尔值?

您应该执行以下操作以使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的类属性SafeConstructorconstructor.py

这并不能使PyYAML 1.2兼容,因为还有更多,而且PyYAML并未完全实现YAML 1.1规范。

将YAML加载到python中并且没有将Yes解释为布尔值的最简单方法是使用ruamel.yaml而不是PyYAML(免责声明:我是该软件包的作者)。 在其源代码中,您还可以找到如果文件被标记为YAML 1.1(如果没有标记ruamel.yaml假定为1.2版)则如何保持解析器1.1的兼容性。

  相关解决方案