Model实例与dict和JSON相互转换的方法

标签:Google App Engine, Python

今天在读GAE SDK源码时发现,Entity实际上就是dict的子类,而Model也有个转换成Entity对象的_to_entity方法,于是可以轻易转换成dict对象,再用simplejson转换成JSON即可。

转换回去就更简单了,因为Model的构造函数是可以传字典参数的,而且还有个from_entity类方法。

原来可以通过key直接删除实体了

标签:Google App Engine, Python

记得最初删除实体时,还需要先fetch或get实体,再调用实体的delete方法或db.delete()来删除,这就导致了删除时效率特别低。

今天突发奇想,觉得db.delete()应该可以接受key做参数,于是看了下源码,发现果然是可行的,而且传实体给它也会被自动转换成key,那么直接传key自然效率更高。

用deferred时遇到个PicklingError

标签:Google App Engine, Python

用deferred写了个任务,本以为没错的代码,测试时却遇到这个错误:
<class 'pickle.PicklingError'>: Can't pickle <function generate_categories at 0x6a4387e469f6a3b8>: it's not found as model.generate_categories
研究了半天才明白过来,model.generate_categories这个玩意我当然没有定义,我是在model模块里调用Category.generate_categories()这个静态函数。看来pickle这个玩意比较傻,只能识别全局对象。

于是加了一行赋值代码,问题解决:
generate_categories = Category.generate_categories

用Akismet的Python模块来反垃圾评论

标签:Python

提到Akismet这个WordPress内置的反垃圾评论插件,很多人应该都了解,我也就不介绍了。

稍微想想就知道,审查肯定不是WordPress自己能做的,那么必然是通过HTTP协议来访问Akismet的API。于是到Akismet官网看了下,发现这个API是公开的,并且对个人用户免费
接着看了下介绍,发现居然提供了2个Python模块,于是就去尝试了一番。

memcache的incr和decr的3处bug

标签:Python, Google App Engine

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

终于看完《Python源码剖析》了

标签:Python

之前下了《Python源码剖析-深度探索动态语言核心技术》这本书,可惜面对这500多页的大块头,实在抽不出什么空。这几天国庆,正好在家闲得无聊,便读起该书,可谓是获益匪浅吧。
如果会Python、C和汇编,看懂它应该是不难的。喜欢Python的确实不应错过,一来可以了解Python的实现原理,二来很容易判断怎样的代码性能会更好。

这里就只记录一些自己比较感兴趣,而以前并不太清楚的东西吧。

« 看看还有什么好玩意