Python中functools模块的常用函数解析
1.partial
首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:
>>>int('10')#实际上等同于int('10',base=10)和int('10',10) 10 >>>int('10',2)#实际上是int('10',base=2)的缩写 2 >>>fromfunctoolsimportpartial >>>int2=partial(int,2)#这里我没写base,结果就出错了 >>>int2('10') Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> TypeError:anintegerisrequired >>>int2=partial(int,base=2)#把base参数绑定在int2这个函数里 >>>int2('10')#现在缺省参数base被设为2了 2 >>>int2('10',3)#没加base,结果又出错了 Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> TypeError:keywordparameter'base'wasgivenbypositionandbyname >>>int2('10',base=3) 3 >>>type(int2) <type'functools.partial'>
从中可以看出,唯一要注意的是可选参数必须写出参数名。
2.update_wrapper
接着是update_wrapper函数,它可以把被封装函数的__name__、__module__、__doc__和__dict__都复制到封装函数去:
#-*-coding:gbk-*- defthisIsliving(fun): defliving(*args,**kw): returnfun(*args,**kw)+'活着就是吃嘛。' returnliving @thisIsliving defwhatIsLiving(): "什么是活着" return'对啊,怎样才算活着呢?' printwhatIsLiving() printwhatIsLiving.__doc__ print fromfunctoolsimportupdate_wrapper defthisIsliving(fun): defliving(*args,**kw): returnfun(*args,**kw)+'活着就是吃嘛。' returnupdate_wrapper(living,fun) @thisIsliving defwhatIsLiving(): "什么是活着" return'对啊,怎样才算活着呢?' printwhatIsLiving() printwhatIsLiving.__doc__
结果:
对啊,怎样才算活着呢?活着就是吃嘛。 None 对啊,怎样才算活着呢?活着就是吃嘛。 什么是活着
不过也没多大用处,毕竟只是少写了4行赋值语句而已。
3.wraps
再有是wraps函数,它将update_wrapper也封装了进来:
#-*-coding:gbk-*- fromfunctoolsimportwraps defthisIsliving(fun): @wraps(fun) defliving(*args,**kw): returnfun(*args,**kw)+'活着就是吃嘛。' returnliving @thisIsliving defwhatIsLiving(): "什么是活着" return'对啊,怎样才算活着呢?' printwhatIsLiving() printwhatIsLiving.__doc__
结果还是一样的:
对啊,怎样才算活着呢?活着就是吃嘛。 什么是活着
4.total_ordering
最后至于total_ordering函数则给予类丰富的排序方法,使用装饰器简化了操作。如果使用必须在类里面定义一个__lt__(),__le__(),__gt__(),或__ge__()。应该给类添加一个__eq__()方法。
fromfunctoolsimporttotal_ordering @total_ordering classStudent(object): def__init__(self,name): self.name=name def__eq__(self,other): returnself.name.lower()==other.name.lower() def__lt__(self,other): returnself.name.lower()<other.name.lower() a=Student('dan') b=Student('mink') printa>b printa printsorted([b,a])
打印结果
False <__main__.Studentobjectat0x7f16ecb194d0> [<__main__.Studentobjectat0x7f16ecb194d0>,<__main__.Studentobjectat0x7f16ecb195d0>]