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 cookielib 登录人人网的实现代码
Dec 19 Python
python代码制作configure文件示例
Jul 28 Python
Python实现的生成格雷码功能示例
Jan 24 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
Python猴子补丁Monkey Patch用法实例解析
Mar 23 Python
python3检查字典传入函数键是否齐全的实例
Jun 05 Python
浅谈keras 的抽象后端(from keras import backend as K)
Jun 16 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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 Swoole异步读取、写入文件操作示例
2019/10/24 PHP
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
jquery属性选择器not has怎么写 行悬停高亮显示
2013/11/13 Javascript
javascript简单实现命名空间效果
2014/03/06 Javascript
jQuery基于扩展简单实现倒计时功能的方法
2016/05/14 Javascript
纯前端JavaScript实现Excel IO案例分享
2016/08/26 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
2017/02/17 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
详解Vue组件之间的数据通信实例
2017/06/17 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
浅谈React Native 传参的几种方式(小结)
2019/05/21 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
小程序实现列表展开收起效果
2020/07/29 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
[53:13]DOTA2-DPC中国联赛 正赛 DLG vs PHOENIX BO3 第三场 1月18日
2021/03/11 DOTA
python 编程之twisted详解及简单实例
2017/01/28 Python
Python3连接SQLServer、Oracle、MySql的方法
2018/06/28 Python
详解python单元测试框架unittest
2018/07/02 Python
使用django实现一个代码发布系统
2019/07/18 Python
Python中最好用的命令行参数解析工具(argparse)
2019/08/23 Python
python数据处理之如何选取csv文件中某几行的数据
2019/09/02 Python
python如何使用socketserver模块实现并发聊天
2019/12/14 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
Debenhams百货英国官方网站:Debenhams UK
2016/07/12 全球购物
化工专业应届生求职信
2013/11/08 职场文书
主持人演讲稿
2014/05/13 职场文书
2014年中秋节活动总结
2014/08/29 职场文书
困难补助申请报告
2015/05/19 职场文书
浅谈怎么给Python添加类型标注
2021/06/08 Python