2017-05-09 81 views
2

我得到這個奇怪的問題,同時加載一個yaml文件與地址轉換爲數字的mac地址。pyyaml將mac地址轉換爲編號

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

但後來我嘗試了以下,我得到的答案如預期。

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

我知道解決方案,這是有引號內的MAC地址,但我想知道這種行爲的原因。

有趣的是,我用ruby嘗試了相同的數據,得到了類似的結果。

EDIT

添加其中它與只有數字

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

回答

5

pyyaml作品與YAML版本1.1支持sexagecimal numbers,以冒號隔開低於60這樣的正整數被認爲是新的測試數據單號,你得到它的十進制表示。如果你希望你的MAC-地址被識別爲字符串只加引號像

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

也有ruamel.yaml這似乎支持YAML 1.2版本,在那裏,他們已經擺脫了sexagecimals的:

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

'ruamel.yaml'如果您的YAML文檔以'%YAML 1.1'開頭或者將該版本指定爲'safe_load'的參數,則會加載sexagecimals,所以程序包沒有擺脫它們。 Sexagesimals不在1.2中,這是ruamel.yaml默認的,它還支持其他1.2特性,例如八進制的'0o'。 (免責聲明:我是你所指的「他們」)。 – Anthon

+0

@Anthon:我的意思是說在YAML 1.2中沒有sexagecimals,沒有包的c –

1

11:00:00:00:00:0011 * 60 * 60 * 60 * 60 * 60 = 8553600000
99:00:00:00:00:0099 * 60 * 60 * 60 * 60 * 60 = 76982400000
被認爲是號碼,因爲它們都以十進制數字開頭,其他所有部分都是從059的十進制數字。

ff:00:00:00:00:00,因爲它含有一個非數字(字母)符號。

52:00:00:60:00:00,因爲它包含了許多出的059範圍這是在第一位置不。

更具體地:

如果第一部分是一個(任意的)的十進制數和所有其他部分059數字,假設單個零件(不包括第一個)是基數60的位置數字系統中的數字,所以它代表整數

在所有其他情況下,它應該是字符串

+0

請檢查編輯部分它的所有數字 –

+0

是的,我檢查了safe_load以及得到了和load相同的結果 –

+0

我編輯了我的答案。 – MarianD