2017-02-16 66 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

謝謝,這真的有幫助 –

相關問題