memcache的incr和decr的3处bug

标签:Python, Google App Engine

一般来说,memcache的incr和decr是用来计数的,那么存储和操作的值一般应该是整数。
而据memcache文档所述,它内部采用的是64位无符号整数,且过大会把高位溢出。
这个无符号整数就很无语了,想保存小于0的数都没办法。而且当值为0时,再进行decr操作,值不会溢出,而是仍然为0。

另一个bug是字符串形式的数值也可以被incr和decr。也就是说,值为'1'时,加1以后会变成'2',再减2会变成'0'。
看上去好像还不坏的bug,但是还有第3个。

第3个bug就是incr和decr设置初始值时,会无视初始值的类型,直接设置成字符串类型。
例如:
from google.appengine.api import memcache

memcache.delete('a')
memcache.incr('a', 1, initial_value=0)
print type(memcache.get('a'))
print (memcache.get('a'))
运行的结果是:
<type 'str'>
1
接下来问题就来了。当我获取'a'对应的值时,我得先判断是不是None,然后再用int()转换成整数,再判断是不是0,再去数据库更新相应的实体。而如果是正常返回整数的话,None和0只要用一条if来判断真值就行了,也不需要再用int()转换。
真不知道Google是怎么搞的,弄得这么奇怪。

2011年11月8日更新:SDK 1.6.0已修复第3个bug。

0条评论 你不来一发么↓

    想说点什么呢?