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对url格式解析的方法
May 13 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
Python字符串、整数、和浮点型数相互转换实例
Aug 04 Python
对Python协程之异步同步的区别详解
Feb 19 Python
Python3中的bytes和str类型详解
May 02 Python
详解Django 时间与时区设置问题
Jul 23 Python
python django model联合主键的例子
Aug 06 Python
linux下python中文乱码解决方案详解
Aug 28 Python
python实现门限回归方式
Feb 29 Python
Pandas中DataFrame交换列顺序的方法实现
Dec 14 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
Python基础知识学习之类的继承
May 31 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
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
php实现获取文章内容第一张图片的方法
2014/11/04 PHP
php实现模拟post请求用法实例
2015/07/11 PHP
php禁用cookie后session设置方法分析
2016/10/19 PHP
PHP实现Unicode编码相互转换的方法示例
2020/11/17 PHP
关于php开启错误提示的总结
2019/09/24 PHP
jquery简单图片切换显示效果实现方法
2015/01/14 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
基于javascript实现按圆形排列DIV元素(三)
2016/12/02 Javascript
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
Angular.js中上传指令ng-upload的基本使用教程
2017/07/30 Javascript
jQuery选择器之属性筛选选择器用法详解
2017/09/19 jQuery
JS中FormData类实现文件上传
2020/03/27 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[01:07:22]2014 DOTA2华西杯精英邀请赛 5 24 DK VS VG加赛
2014/05/26 DOTA
常用python数据类型转换函数总结
2014/03/11 Python
Python中的条件判断语句基础学习教程
2016/02/07 Python
在pycharm中python切换解释器失败的解决方法
2018/10/29 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
python实现图片中文字分割效果
2019/07/22 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
html5 CSS过度-webkit-transition使用介绍
2013/07/02 HTML / CSS
美国网上订购鲜花:FTD
2016/09/23 全球购物
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
Wilson体育用品官网:美国著名运动器材品牌
2019/05/12 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
传媒专业推荐信范文
2013/11/23 职场文书
亲子活动总结
2014/04/26 职场文书
应届大专生求职信
2014/06/26 职场文书
公安局班子个人对照检查材料思想汇报
2014/10/09 职场文书
2014年防汛工作总结
2014/12/08 职场文书
关于做家务的心得体会
2016/01/23 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS