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验证码识别
Jan 25 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
wxpython实现图书管理系统
Mar 12 Python
Python requests发送post请求的一些疑点
May 20 Python
Django中反向生成models.py的实例讲解
May 30 Python
解决python读取几千万行的大表内存问题
Jun 26 Python
Sanic框架路由用法实例分析
Jul 16 Python
Python lxml解析HTML并用xpath获取元素的方法
Jan 02 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
Python操作rabbitMQ的示例代码
Mar 19 Python
Python的控制结构之For、While、If循环问题
Jun 30 Python
pytorch 实现多个Dataloader同时训练
May 29 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基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
2019/05/25 PHP
laravel 框架实现无限级分类的方法示例
2019/10/31 PHP
jQuery 全选/反选以及单击行改变背景色实例
2013/07/02 Javascript
ie9 提示'console' 未定义问题的解决方法
2014/03/20 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
使用javascript获取页面名称
2014/12/23 Javascript
学JavaScript七大注意事项【必看】
2016/05/04 Javascript
jsTree使用记录实例
2016/12/01 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
js实现以最简单的方式将数组元素添加到对象中的方法
2017/12/20 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
Vue搭建后台系统需要注意的问题
2019/11/08 Javascript
原生JavaScript实现滑动拖动验证的示例代码
2019/12/06 Javascript
js实现全选和全不选功能
2020/07/28 Javascript
python append、extend与insert的区别
2016/10/13 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python将回车作为输入内容的实例
2018/06/23 Python
python实现简单的文字识别
2018/11/27 Python
六行python代码的爱心曲线详解
2019/05/17 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python和Bash结合在一起的方法
2020/11/13 Python
Python应用自动化部署工具Fabric原理及使用解析
2020/11/30 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
美国最大的珠宝商之一:Littman Jewelers
2016/11/13 全球购物
自我评价格式
2014/01/06 职场文书
白酒市场营销方案
2014/02/25 职场文书
公务员培的训心得体会
2014/09/01 职场文书
党员干部群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
考试作弊检讨书
2014/10/21 职场文书
2014年度工作总结报告
2014/12/15 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
mysql查找连续出现n次以上的数字
2022/05/11 MySQL