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 client使用http post 到server端的代码
Feb 10 Python
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
Python的自动化部署模块Fabric的安装及使用指南
Jan 19 Python
python调用fortran模块
Apr 08 Python
python结合selenium获取XX省交通违章数据的实现思路及代码
Jun 26 Python
python处理html转义字符的方法详解
Jul 01 Python
python机器学习之神经网络(二)
Dec 20 Python
在python 中实现运行多条shell命令
Jan 07 Python
Django保护敏感信息的方法示例
May 09 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
一些关于python 装饰器的个人理解
Aug 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
高分R级DC动画剧《哈莉·奎茵》第二季正式预告首发
2020/04/09 欧美动漫
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
jquery 获取 outerHtml 包含当前节点本身的代码
2014/10/30 Javascript
6种javascript显示当前系统时间代码
2015/12/01 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
2016/11/10 Javascript
js通过指定下标或指定元素进行删除数组的实例
2017/01/12 Javascript
使用D3.js制作图表详解
2017/08/13 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
基于Vue实现微信小程序的图文编辑器
2018/07/25 Javascript
详解使用uni-app开发微信小程序之登录模块
2019/05/09 Javascript
js使用文件流下载csv文件的实现方法
2019/07/15 Javascript
JavaScript计算出两个数的差值
2020/03/19 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
vue prop传值类型检验方式
2020/07/30 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
vue浏览器返回监听的具体步骤
2021/02/03 Vue.js
Python、PyCharm安装及使用方法(Mac版)详解
2017/04/28 Python
详解django中自定义标签和过滤器
2017/07/03 Python
python matplotlib中文显示参数设置解析
2017/12/15 Python
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
使用PyCharm官方中文语言包汉化PyCharm
2020/11/18 Python
Python类class参数self原理解析
2020/11/19 Python
详解HTML5 window.postMessage与跨域
2017/05/11 HTML / CSS
Blue Nile台湾:钻石珠宝商,订婚首饰、结婚戒指和精品首饰
2017/11/24 全球购物
在c#中using和new这两个关键字有什么意义
2013/05/19 面试题
自荐信格式范文
2013/10/07 职场文书
商场总经理岗位职责
2014/02/03 职场文书
学校节能减排方案
2014/06/13 职场文书
我的职业生涯规划:打造自己的运动帝国
2014/09/18 职场文书
以权谋私检举信范文
2015/03/02 职场文书
护士医德考评自我评价
2015/03/03 职场文书
开学第一周总结
2015/07/16 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
科级干部培训心得体会
2016/01/06 职场文书