发表于2011年10月的文章

用Python Decorator简化代码

发表于2011年10月14日

看码不说话。

def deco(callable):
    def method(a, b):
        print "a: %s" % a
        print "b: %s" % b
        return callable(a, b)
    return method
 
@deco
def test1(a,b):
    print a+b
 
test1(10,20)

上面的Decorator只能装饰有两个参数的函数,否则

@deco
def test2(a,b,c):
    print a+b+c

会报错

>>> test2(10,20,30)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: method() takes exactly 2 arguments (3 given)

如需支持装饰任意参数的函数,得使用以下方法:

def deco(callable):
    def method(*args, **kws):
        print "args: %s" % repr(args)
        print "kws: %s" % repr(kws)
        return callable(*args, **kws)
    return method
 
@deco
def test1(a,b):
    print a+b
 
@deco
def test2(a,b,c):
    print a+b+c
 
test1(10,20)
test1(10,b=20)
test2(10,20,30)
test2(10,b=20,c=30)

结果是:

>>> test1(10,20)
args: (10, 20)
args: {}
30
>>> test1(10,b=20)
args: (10,)
args: {'b': 20}
30
>>> test2(10,20,30)
args: (10, 20, 30)
args: {}
60
>>> test2(10,b=20,c=30)
args: (10,)
args: {'c': 30, 'b': 20}
60

在MongoDB中sum某个字段

发表于2011年10月9日

假设每一条记录有一个叫做pv的整数字段,求整个集合中这个字段的和可以用如下方法:

> use test
switched to db test
> db.statistics.insert({created_on: "2011-10-01", pv: 100})
> db.statistics.insert({created_on: "2011-10-02", pv: 200})
> db.statistics.insert({created_on: "2011-10-03", pv: 300})
> var reduce = function(key, values){
...     var count=0;
...     values.forEach(function(v) {
...        count+=v.pv;
...     });
...     return {count: count};
... };
> var s = db.statistics.find();
> reduce("total_pv", s);

结果如下:

{ "count" : 600 }