2017-05-09 84 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