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时间整形转标准格式的示例分享
Feb 14 Python
python实现数通设备tftp备份配置文件示例
Apr 02 Python
Python处理XML格式数据的方法详解
Mar 21 Python
Python反射用法实例简析
Dec 22 Python
在双python下设置python3为默认的方法
Oct 31 Python
Python 调用 zabbix api的方法示例
Jan 06 Python
在python里从协程返回一个值的示例
Feb 19 Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 Python
python制作英语翻译小工具代码实例
Sep 09 Python
Python如何访问字符串中的值
Feb 09 Python
Django Xadmin多对多字段过滤实例
Apr 07 Python
python实现简单的三子棋游戏
Apr 28 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
在apache下限制每个虚拟主机的并发数!!!!
2006/10/09 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
PHP分页效率终结版(推荐)
2013/07/01 PHP
php实现文件编码批量转换
2014/03/10 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
QUnit jQuery的TDD框架
2010/11/04 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
jqueryUI里拖拽排序示例分析
2015/02/26 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
Angular企业级开发——MVC之控制器详解
2017/02/20 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
JavaScript实现计数器基础方法
2017/10/10 Javascript
详解vue-cli 构建项目 vue-cli请求后台接口 vue-cli使用axios、sass、swiper
2018/05/28 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
微信小程序自定义组件封装及父子间组件传值的方法
2018/08/28 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
深入浅析vue全局环境变量和模式
2020/04/28 Javascript
原生js实现弹幕效果
2020/11/29 Javascript
python插入数据到列表的方法
2015/04/30 Python
收藏整理的一些Python常用方法和技巧
2015/05/18 Python
Python中的命令行参数解析工具之docopt详解
2017/03/27 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
2019/06/28 Python
深入浅析python的第三方库pandas
2020/02/13 Python
平面设计师的工作职责
2013/11/21 职场文书
合伙经营协议书
2014/04/18 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
技术经济专业求职信
2014/09/03 职场文书
质量整改通知单
2015/04/21 职场文书
2015年酒店销售部工作总结
2015/07/24 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书