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调用shell的方法
Nov 20 Python
Python检测生僻字的实现方法
Oct 23 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
基于Django与ajax之间的json传输方法
May 29 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
Python Django 页面上展示固定的页码数实现代码
Aug 21 Python
Python测试Kafka集群(pykafka)实例
Dec 23 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
matplotlib 对坐标的控制,加图例注释的操作
Apr 17 Python
python3 sleep 延时秒 毫秒实例
May 04 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 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
在yii中新增一个用户验证的方法详解
2013/06/20 PHP
利用laravel+ajax实现文件上传功能方法示例
2017/08/13 PHP
基于jquery的固定表头和列头的代码
2012/05/03 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
关于jquery中attr()和prop()方法的区别
2018/05/28 jQuery
微信小程序用户信息encryptedData详解
2018/08/24 Javascript
webpack中如何使用雪碧图的示例代码
2018/11/11 Javascript
JavaScript 面向对象基础简单示例
2019/10/02 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
Python中动态检测编码chardet的使用教程
2017/07/06 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
详解python中的index函数用法
2019/08/06 Python
正则给header的冒号两边参数添加单引号(Python请求用)
2019/08/09 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
amazeui页面校验功能的实现代码
2020/08/24 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
牵手50香港:专为黄金岁月的单身人士而设的交友网站
2020/08/14 全球购物
儿科护理实习自我鉴定
2013/09/19 职场文书
网游商务专员求职信
2013/10/15 职场文书
端午节演讲稿
2014/05/23 职场文书
临床医学专业求职信
2014/08/08 职场文书
班子四风对照检查材料
2014/08/21 职场文书
家庭教育的心得体会
2014/09/01 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
销售合作意向书范本
2015/05/08 职场文书
公司管理建议书
2015/09/14 职场文书
小学班主任培训心得体会
2016/01/07 职场文书
儿童诗两首教学反思
2016/02/23 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书