python的小坑:%u
最近在开发过程中,有一小处代码需要将一个无符号32位整数转成字符串,于是想当然地按照C格式化的方法,采用了类似写法:
print "a=%u"%-1
本来预期是输出内容为:
a=4294967295
实际结果并没有转化为无符号整数,仍然采用了有符号整数方式:
a=-1
作为一名C/C++程序员,对这个结果自然感到惊讶。很显然,python把%u和%d等同起来了。于是搜了一下python的文档,在字符串格式化章节中有这样的描述:
%u Obsolete type – it is identical to 'd'.
根据这文档中的内容,又进一步找到了PEP-0237,其中又强调了这点:
this means that '%u' becomes an alias for '%d'. It will eventually be removed.
虽然不是很理解为什么采取这种做法,但是很明显,在python代码中不应该再使用%u了,这个格式转换完全等同于%d,而且在后续的版本中有可能会被删除掉。
在空闲之余,又挖了一下python的代码,的确也反应了上述各项说明:
- PyString_Format 函数中,’iduoxX’都按照 PyInt 处理;
- 接着在 formatint 函数中,明确进行以下转换:
-
if (x < 0 && type == 'u') { type = 'd'; }