YAML lädt 5e-6 als String und nicht als Zahl

8

Wenn ich eine Zahl mit einem JSON-Dump mit YAML einlege, wird die Zahl als String und nicht als Float geladen.

Ich denke, dieses einfache Beispiel kann mein Problem erklären.

%Vor%

YAML lädt 1e-06 als Zeichenfolge und nicht als Zahl? Wie kann ich es beheben?

    
Oren 26.05.2015, 12:45
quelle

1 Antwort

10

Das Problem liegt in der Tatsache, dass der YAML-Resolver so eingerichtet ist, dass er Floats wie folgt abbildet:

%Vor%

wobei die YAML-Spezifikation die Regex für die wissenschaftliche Notation wie folgt spezifiziert:

%Vor%

Letzteres macht den Punkt optional, was nicht das obige re.compile() -Muster ist.

Der Vergleich von Gleitkommazahlen kann korrigiert werden, so dass Gleitkommawerte mit einem e / E , aber ohne Dezimalpunkt und mit Exponenten ohne Vorzeichen (d. h. + impliziert) akzeptiert werden:

%Vor%

ergibt:

%Vor%

Es gibt eine Diskrepanz zwischen dem, was JSON in Zahlen erlaubt, und der Regex in der Spezifikation YAML 1.2 (bezüglich des erforderlichen Punkts in der Zahl und e in Kleinbuchstaben). Die JSON-Spezifikation ist IMO sehr klar, da sie weder den Punkt vor 'e / E' erfordert noch ein Zeichen nach dem das "e / E":

Die PyYAML-Implementierung passt Floats teilweise gemäß der JSON-Spezifikation und teilweise gegen die Regex an und schlägt bei Zahlen fehl, die gültig sein sollten.

ruamel.yaml (das ist meine erweiterte Version von PyYAML), hat diese aktualisierten Muster und funktioniert korrekt:

%Vor%

mit Ausgabe:

%Vor%

ruamel.yaml akzeptiert auch die Nummer '1.0e6', die PyYAML auch als String ansieht.

    
Anthon 26.05.2015, 14:52
quelle

Tags und Links