pyyaml将mac地址转换为数字

时间:2017-05-09 14:47:21

标签: python ruby yaml pyyaml

我在加载带有mac地址的yaml文件时遇到了这个奇怪的问题,其中地址转换为数字。

>>> 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尝试了相同的数据并得到了类似的结果。

修改

添加仅适用于数字的新测试数据

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

2 个答案:

答案 0 :(得分:5)

pyyaml适用于支持sexagecimal numbers的YAML 1.1版,因此使用冒号分隔的低于60的正整数被视为单个数字,并且您将获得其十进制表示。如果您希望将MAC地址识别为字符串,只需添加引号,如

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

此外还有ruamel.yaml似乎支持YAML 1.2版本,他们已经摆脱了性质:

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

答案 1 :(得分: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
被认为是数字,因为它们都以十进制数开头,而所有其他部分都是从059的十进制数。

ff:00:00:00:00:00字符串,因为它包含非数字(字母)符号。

52:00:00:60:00:00是一个字符串,因为它包含的数字超出059 的范围,不在第一位

更具体一点:

如果第一部分是(任意)十进制数,所有其他部分是从059的数字,则认为各个部分(不包括第一个)是基础60的位置数字系统中的数字,因此它代表整数

在所有其他情况下,它应该是字符串