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实现自动登录人人网并访问最近来访者实例
Sep 26 Python
python 文件操作api(文件操作函数)
Aug 28 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
python生成不重复随机数和对list乱序的解决方法
Apr 09 Python
Django 路由控制的实现代码
Nov 08 Python
对Python 除法负数取商的取整方式详解
Dec 12 Python
Django ORM 聚合查询和分组查询实现详解
Aug 09 Python
Pytorch 保存模型生成图片方式
Jan 10 Python
详解pandas中iloc, loc和ix的区别和联系
Mar 09 Python
python框架flask入门之环境搭建及开启调试
Jun 07 Python
pycharm实现猜数游戏
Dec 07 Python
Python实现生成bmp图像的方法
Jun 13 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
ajax缓存问题解决途径
2006/12/06 PHP
修复ShopNC使用QQ 互联时提示100010 错误
2015/11/08 PHP
PHP判断表达式中括号是否匹配的简单实例
2016/10/22 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
2019/02/13 PHP
Node.js中对通用模块的封装方法
2014/06/06 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
原生js实现autocomplete插件
2016/04/14 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
js Canvas绘制圆形时钟效果
2017/02/17 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
2017/10/19 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
教大家使用Python SqlAlchemy
2016/02/12 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Python 3.8新特征之asyncio REPL
2019/05/28 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python实现序列化及csv文件读取
2020/01/19 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
世界领先的在线地板和建筑材料批发商:BuildDirect
2017/02/26 全球购物
BLACKMORES澳洲官网:澳大利亚排名第一的保健品牌
2018/09/27 全球购物
中层干部竞争上岗演讲稿
2014/01/13 职场文书
师说教学反思
2014/02/07 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
人民调解员先进事迹材料
2014/05/08 职场文书
计划生育证明书写要求
2014/09/17 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
巾帼文明岗汇报材料
2014/12/24 职场文书
学生保证书格式
2015/02/27 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
Keras多线程机制与flask多线程冲突的解决方案
2021/05/28 Python
Element-ui Layout布局(Row和Col组件)的实现
2021/12/06 Vue.js
台式电脑蓝牙适配器怎么安装?台式电脑蓝牙适配器安装教程
2022/04/08 数码科技