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中os模块详解
Oct 14 Python
Python编程实现双击更新所有已安装python模块的方法
Jun 05 Python
Python编程实现的简单Web服务器示例
Jun 22 Python
Python3 适合初学者学习的银行账户登录系统实例
Aug 08 Python
python Spyder界面无法打开的解决方法
Apr 27 Python
python 利用pandas将arff文件转csv文件的方法
Feb 12 Python
anaconda如何查看并管理python环境
Jul 05 Python
Python字符串、列表、元组、字典、集合的补充实例详解
Dec 20 Python
Python彻底删除文件夹及其子文件方式
Dec 23 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
Python学习笔记之装饰器
Aug 06 Python
Python OpenGL基本配置方式
May 20 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截取后台登陆密码的代码
2012/05/05 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
php中使用GD库做验证码
2016/03/31 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
把JS与CSS写在同一个文件里的书写方法
2007/06/02 Javascript
显示js对象所有属性和方法的函数
2009/10/16 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
JavaScript实现设置默认日期范围为最近40天的方法分析
2017/07/12 Javascript
纯js实现画一棵树的示例
2017/09/05 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
JS实现随机生成10个手机号的方法示例
2018/12/07 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
vue 中的 render 函数作用详解
2020/02/28 Javascript
Pthon批量处理将pdb文件生成dssp文件
2015/06/21 Python
Python实现希尔排序算法的原理与用法实例分析
2017/11/23 Python
Python设计模式之命令模式原理与用法实例分析
2019/01/11 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
django drf框架中的user验证以及JWT拓展的介绍
2019/08/12 Python
Python动态导入模块:__import__、importlib、动态导入的使用场景实例分析
2020/03/30 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
python 字符串格式化的示例
2020/09/21 Python
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
教师求职推荐信范文
2013/11/20 职场文书
自我鉴定标准格式
2014/03/19 职场文书
秘书英文求职信
2014/04/16 职场文书
社区党员公开承诺书
2014/08/30 职场文书
小班上学期个人总结
2015/02/12 职场文书
学校教学工作总结2015
2015/05/19 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书
Python中文纠错的简单实现
2021/07/07 Python