2017-02-16 2 views
0

Es sieht aus wie pyyaml ​​Teil der YAML 1.1 spec implementiert, die eine Menge verschiedenen Werte erlaubt als wahr oder falsch interpretiert werden:Gibt es eine Möglichkeit, pyyaml ​​die liberale Behandlung von booleschen Werten zu überschreiben?

Canonical:

y|n 

Regexp:

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 

und es serialisiert sie zu true oder false (im Gegensatz zu mit YAML 1.1 kanonischen y und n):

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

Gibt es eine Möglichkeit, es zu überschreiben, so dass nur die kanonischen true und false Werte als booleans interpretiert werden?

Antwort

1

sollten Sie die folgenden Schritte aus, um PyYAML nicht diese Zeichenfolgen als booleans zu erkennen:

  • den zusätzlichen impliziten Resolver ersetzen, die in resolver.py hinzugefügt wurde, und das standardmäßig lautet:

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

    müssen Sie die add_implicit_resolver verfolgen, um zu sehen, wo es hinzugefügt wird, da es keine remove_implicit_resolver gibt. Alternativ definieren Sie eine komplette neue ResolverBase Unterklasse, die alles tut Resolver tut, aber hat nicht die Definition für 2002:bool wie oben, aber die eingeschränkte (1.2) Version.

  • Update der bool_values Klasse Attribut SafeConstructor in constructor.py

Das ist nicht PyYAML 1.2 kompatibel macht, da es mehr darauf ist und PyYAML nicht vollständig die YAML 1.1-Spezifikation implementieren, mit zu beginnen .

Der einfachste Weg, YAML in Python zu laden und Yes nicht als Boolean zu interpretieren, ist die Verwendung von ruamel.yaml anstelle von PyYAML (Disclaimer: Ich bin der Autor dieses Pakets). In seinen Quellen finden Sie auch, wie man den Parser 1.1 kompatibel hält, wenn die Datei als YAML 1.1 gekennzeichnet ist (wenn es kein Tag gibt, nimmt ramel.yaml Version 1.2 an).

+1

danke, das hilft wirklich –

Verwandte Themen