2017-05-09 2 views
2

Ich habe dieses seltsame Problem beim Laden einer YAML-Datei mit einer MAC-Adresse, wo die Adresse in Nummer umgewandelt wurde.pyyaml ​​konvertiert MAC-Adresse in Nummer

>>> yaml.safe_load('abc: 11:00:00:00:00:00') 
{'abc': 8553600000} 
>>> yaml.safe_load('abc: 99:00:00:00:00:00') 
{'abc': 76982400000} 

Aber dann versuchte ich mit folgen und ich bekomme Antwort wie erwartet.

Ich kenne Lösung für diese, die die MAC-Adressen in Anführungszeichen haben soll, aber ich möchte Grund für dieses Verhalten wissen.

Interessanterweise habe ich gleiche Daten mit Ruby und ähnliche Ergebnisse versucht.

EDIT

neue Testdaten hinzufügen, wo es funktioniert nur mit Zahlen

>>> yaml.load('abc: 52:00:00:60:00:00') 
{'abc': '52:00:00:60:00:00'} 

Antwort

5

pyyaml Arbeiten mit YAML-Version 1.1, die sexagecimal numbers unterstützt, so positive ganze Zahlen von weniger als 60 mit Doppelpunkten voneinander getrennt werden als einzelne Zahl und Sie erhalten ihre dezimale Darstellung. Wenn Sie Ihre MAC-Adressen erkannt werden wollen als Strings nur Anführungszeichen hinzufügen, wie

>>>yaml.safe_load('abc: "11:00:00:00:00:00"') 
{'abc': '11:00:00:00:00:00'} 

Auch ist es ruamel.yaml die YAML Version 1.2 zu unterstützen scheint, wo sie loswerden sexagecimals haben:

>>>import ruamel.yaml 
>>>ruamel.yaml.safe_load('abc: 11:00:00:00:00') 
{'abc': '11:00:00:00:00'} 
+1

'ramel.yaml' lädt sexagecimals, wenn Ihr YAML-Dokument mit'% YAML 1.1' beginnt oder diese Version als Parameter für 'safe_load' angibt, damit das Paket sie nicht loswird. Sexagesimals sind nicht in 1.2 und das ist, was "ruamel.yaml" standardmäßig verwendet, es unterstützt auch andere 1.2-Funktionen wie "0o" für Oktale. (Disclaimer: Ich bin "sie", auf die Sie sich beziehen). – Anthon

+0

@ Anthon: Ich meinte, dass in YAML 1.2 gibt es keine sexagecimals, nicht im Paket ofc –

1

11:00:00:00:00:00(11 * 60 * 60 * 60 * 60 * 60 = 8553600000)
99:00:00:00:00:00(99 * 60 * 60 * 60 * 60 * 60 = 76982400000)
werden als Nummern betrachtet, da sie beide mit einer Dezimalzahl beginnen und alle anderen Teile sind Dezimalzahlen von 0 bis 59.

ff:00:00:00:00:00 ist ein String , da es ein nicht-digit (alphabetisches) Symbol enthält.

52:00:00:60:00:00 ist ein String da es eine Reihe außerhalb der Reichweite des zu 059 enthält, ist nicht in der 1. Position.

Um genauer zu sein:

Wenn der erste Teil eine (beliebige) Zahl dezimal und alle anderen Teile Zahlen sind von 0 zu 59, wird angenommen, dass Einzelteile (mit Ausnahme der erstens) sind Ziffern im Positionsnummernsystem der Basis 60, so dass es eine ganze Zahl darstellt.

In allen anderen Fällen soll es ein String sein.

+0

überprüfen Sie bitte bearbeiten Teil, wo es alle Zahlen ist –

+0

ja, ich auch mit safe_load überprüft und habe das gleiche Ergebnis wie Last –

+0

Ich habe meine Antwort bearbeitet. – MarianD