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

ですが、まだにシリアル化しています(YAML 1.1のyn正規のとは対照的に)またはfalse

>>> 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')) 
    

    remove_implicit_resolverがない場合は、add_implicit_resolverを追加してどこに追加するかを確認する必要があります。あるいは、Resolverのすべてを行う完全な新しいResolverBaseサブクラスを定義しますが、上記のように2002:boolの定義はありませんが、制限付き(1.2)のバージョンは定義しません。

  • 更新がそれによりであり、PyYAMLとは完全に起動するYAML 1.1仕様を実装していないとして、PyYAMLと1.2は互換性がありませんconstructor.py

SafeConstructorbool_valuesクラス属性。

YAMLをPythonにロードするためのもっとも簡単な方法は、Pythonに代わってruamel.yamlを使用することです(免責事項:私はそのパッケージの作者です)。そのソースでは、ファイルがYAML 1.1としてタグ付けされている場合(タグruamel.yamlがバージョン1.2を前提としていない場合)、パーサー1.1との互換性を維持する方法を見つけることもできます。

+1

ありがとう、これは本当に役立ちます –

関連する問題