2017-02-16 70 views
0

它看起来像pyyaml实现YAML 1.1 spec,这让很多不同的价值观的一部分被解释为真或假:有没有什么方法可以覆盖pyyaml自由处理布尔值?

规范:

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值被解释为布尔值?

回答

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)版本。

  • 更新的constructor.py

的的SafeConstructorbool_values类属性,它不会使PyYAML 1.2兼容,因为还有更多的是和PyYAML没有完全实现的YAML 1.1规范入手。

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

+1

谢谢,这真的有帮助 –

相关问题