这个模块提供了3个有趣的函数,这里介绍下其用法。
首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:
[python] view plain copy print ?
1. >>> int('10') # 实际上等同于int('10', base=10)和int('10', 10)
2. 10
3. >>> int('10', 2) # 实际上是int('10', base=2)的缩写
4. 2
5. >>> from functools import partial
6. >>> int2 = partial(int, 2) # 这里我没写base,结果就出错了
7. >>> int2('10')
8. Traceback (most recent call last):
9. "<stdin>", line 1, in <module>
10. TypeError: an integer is required
11. >>> int2 = partial(int, base=2) # 把base参数绑定在int2这个函数里
12. >>> int2('10') # 现在缺省参数base被设为2了
13. 2
14. >>> int2('10', 3) # 没加base,结果又出错了
15. Traceback (most recent call last):
16. "<stdin>", line 1, in <module>
17. TypeError: keyword parameter 'base' was given by position and by name
18. >>> int2('10', base=3)
19. 3
20. >>> type(int2)
21. <type 'functools.partial'>
从中可以看出,唯一要注意的是可选参数必须写出参数名。
接着是update_wrapper函数,它可以把被封装函数的__name__、__module__、__doc__和 __dict__都复制到封装函数去:
[python] view plain copy print ?
1. #-*- coding: gbk -*-
2.
3. def thisIsliving(fun):
4. def living(*args, **kw):
5. return fun(*args, **kw) + '活着就是吃嘛。'
6. return living
7.
8. @thisIsliving
9. def whatIsLiving():
10. "什么是活着"
11. return '对啊,怎样才算活着呢?'
12.
13. print whatIsLiving()
14. print whatIsLiving.__doc__
15.
16. print
17.
18. from functools import update_wrapper
19. def thisIsliving(fun):
20. def living(*args, **kw):
21. return fun(*args, **kw) + '活着就是吃嘛。'
22. return update_wrapper(living, fun)
23.
24. @thisIsliving
25. def whatIsLiving():
26. "什么是活着"
27. return '对啊,怎样才算活着呢?'
28.
29. print whatIsLiving()
30. print whatIsLiving.__doc__
结果:
对啊,怎样才算活着呢?活着就是吃嘛。
None
对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着
不过也没多大用处,毕竟只是少写了4行赋值语句而已。
最后是wraps函数,它将update_wrapper也封装了进来:
[python] view plain copy print ?
1. #-*- coding: gbk -*-
2.
3. from functools import wraps
4.
5. def thisIsliving(fun):
6. @wraps(fun)
7. def living(*args, **kw):
8. return fun(*args, **kw) + '活着就是吃嘛。'
9. return living
10.
11. @thisIsliving
12. def whatIsLiving():
13. "什么是活着"
14. return '对啊,怎样才算活着呢?'
15.
16. print whatIsLiving()
17. print whatIsLiving.__doc__
结果还是一样的:
对啊,怎样才算活着呢?活着就是吃嘛。
什么是活着