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
>>> from functools import partial
>>> int2 = partial(int, 2) # 这里我没写base,结果就出错了
>>> int2(’10’)
traceback (most recent call last):
file “”, line 1, in
typeerror: an integer is required
>>> int2 = partial(int, base=2) # 把base参数绑定在int2这个函数里
>>> int2(’10’) # 现在缺省参数base被设为2了
2
>>> int2(’10’, 3) # 没加base,结果又出错了
traceback (most recent call last):
file “”, line 1, in
typeerror: keyword parameter ‘base’ was given by position and by name
>>> int2(’10’, base=3)
3
>>> type(int2)

从中可以看出,唯一要注意的是可选参数必须写出参数名。

2.update_wrapper接着是update_wrapper函数,它可以把被封装函数的__name__、__module__、__doc__和 __dict__都复制到封装函数去:

#-*- coding: gbk -*-
def thisisliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + ‘活着就是吃嘛。’
return living
@thisisliving
def whatisliving():
“什么是活着”
return ‘对啊,怎样才算活着呢?’
print whatisliving()
print whatisliving.__doc__
print
from functools import update_wrapper
def thisisliving(fun):
def living(*args, **kw):
return fun(*args, **kw) + ‘活着就是吃嘛。’
return update_wrapper(living, fun)
@thisisliving
def whatisliving():
“什么是活着”
return ‘对啊,怎样才算活着呢?’
print whatisliving()
print whatisliving.__doc__

结果:

对啊,怎样才算活着呢?活着就是吃嘛。
none
对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着

不过也没多大用处,毕竟只是少写了4行赋值语句而已。

3.wraps再有是wraps函数,它将update_wrapper也封装了进来:

#-*- coding: gbk -*-
from functools import wraps
def thisisliving(fun):
@wraps(fun)
def living(*args, **kw):
return fun(*args, **kw) + ‘活着就是吃嘛。’
return living
@thisisliving
def whatisliving():
“什么是活着”
return ‘对啊,怎样才算活着呢?’
print whatisliving()
print whatisliving.__doc__

结果还是一样的:

对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着

4.total_ordering最后至于total_ordering函数则给予类丰富的排序方法,使用装饰器简化了操作。如果使用必须在类里面定义一个__lt__(),__le__(), __gt__(), 或__ge__()。应该给类添加一个__eq__() 方法。

from functools import total_ordering
@total_ordering
class student(object):
def __init__(self, name):
self.name = name
def __eq__(self, other):
return self.name.lower() == other.name.lower()
def __lt__(self, other):
return self.name.lower() < other.name.lower() a = student('dan') b = student('mink') print a > b
print a
print sorted([b, a])

打印结果

false

[, ]

更多python中functools模块的常用函数解析相关文章请关注php中文网!

Posted in 未分类

发表评论