Python中functools模块的常用函数解析


Posted in Python onJune 30, 2016

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 "<stdin>", line 1, in <module> 
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 "<stdin>", line 1, in <module> 
TypeError: keyword parameter 'base' was given by position and by name 
>>> int2('10', base=3) 
3 
>>> type(int2) 
<type 'functools.partial'>

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

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
<__main__.Student object at 0x7f16ecb194d0>
[<__main__.Student object at 0x7f16ecb194d0>, <__main__.Student object at 0x7f16ecb195d0>]
Python 相关文章推荐
Python 2.7.x 和 3.x 版本的重要区别小结
Nov 28 Python
浅谈终端直接执行py文件,不需要python命令
Jan 23 Python
Python双向循环链表实现方法分析
Jul 30 Python
python实现多进程代码示例
Oct 31 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
用python做游戏的细节详解
Jun 25 Python
python实现复制大量文件功能
Aug 31 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
Python socket服务常用操作代码实例
Jun 22 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
python网络爬虫实现发送短信验证码的方法
Feb 25 Python
深入浅析Python中join 和 split详解(推荐)
Jun 30 #Python
Python列出一个文件夹及其子目录的所有文件
Jun 30 #Python
django之常用命令详解
Jun 30 #Python
全面了解Python环境配置及项目建立
Jun 30 #Python
浅谈Python 集合(set)类型的操作——并交差
Jun 30 #Python
python dict.get()和dict['key']的区别详解
Jun 30 #Python
python中set常用操作汇总
Jun 30 #Python
You might like
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
PHP设计模式之命令模式的深入解析
2013/06/13 PHP
php中3种方法删除字符串中间的空格
2014/03/10 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
php中的字符编码转换函数用法示例
2014/10/20 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
addRule在firefox下的兼容写法
2006/11/30 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
jQuery 性能优化手册 推荐
2010/02/23 Javascript
javascript 隔行换色函数代码
2010/10/24 Javascript
JavaScript模板引擎用法实例
2015/07/10 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
jQuery数组处理函数整理
2016/08/03 Javascript
jQuery中Find选择器用法示例
2016/09/21 Javascript
jQuery基于Ajax方式提交表单功能示例
2017/02/10 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
nodejs实现简单的gulp打包
2017/12/21 NodeJs
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
vue 中filter的多种用法
2018/04/26 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
2018/09/27 Javascript
JS使用百度地图API自动获取地址和经纬度操作示例
2019/04/16 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
js中console在一行内打印字符串和对象的方法
2019/09/10 Javascript
微信小程序表单验证WxValidate的使用
2019/11/27 Javascript
Python天气预报采集器实现代码(网页爬虫)
2012/10/07 Python
python文件操作之目录遍历实例分析
2015/05/20 Python
python3中zip()函数使用详解
2018/06/29 Python
Python logging日志模块 配置文件方式
2020/07/12 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
新加坡最佳婴儿用品店:Mamahood.com.sg
2018/08/26 全球购物
《蜗牛的奖杯》教后反思
2014/04/24 职场文书
百日安全活动总结
2014/05/04 职场文书
2014年班主任工作总结
2014/11/08 职场文书