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中的Numpy入门教程
Apr 26 Python
Python中MySQL数据迁移到MongoDB脚本的方法
Apr 28 Python
python ddt实现数据驱动
Mar 14 Python
Python for循环中的陷阱详解
Jul 13 Python
python 去除txt文本中的空格、数字、特定字母等方法
Jul 24 Python
python爬虫解决验证码的思路及示例
Aug 01 Python
基于Python共轭梯度法与最速下降法之间的对比
Apr 02 Python
Pandas将列表(List)转换为数据框(Dataframe)
Apr 24 Python
keras实现theano和tensorflow训练的模型相互转换
Jun 19 Python
python+django+selenium搭建简易自动化测试
Aug 19 Python
解决PyCharm IDE环境下,执行unittest不生成测试报告的问题
Sep 03 Python
深度学习tensorflow基础mnist
Apr 14 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
让这部DC动画新作刷新你的认知
2020/03/03 欧美动漫
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
PHP自带ZIP压缩、解压缩类ZipArchiv使用指南
2015/03/03 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
2017/06/15 PHP
在jquery中处理带有命名空间的XML数据
2011/06/13 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
JavaScript实现在标题栏上显示当前日期的方法
2015/03/19 Javascript
javascript中对Date类型的常用操作小结
2016/05/19 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
2017/03/09 Javascript
vue 实现的树形菜的实例代码
2018/03/19 Javascript
JavaScript累加、迭代、穷举、递归等常用算法实例小结
2018/05/08 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
vscode中eslint插件的配置(prettier配置无效)
2019/09/10 Javascript
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
Python可变参数*args和**kwargs用法实例小结
2018/04/27 Python
python字典的常用方法总结
2019/07/31 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
python 爬取免费简历模板网站的示例
2020/09/27 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
应用心理学个人求职信范文
2013/12/11 职场文书
新学期红领巾广播稿
2014/01/14 职场文书
敬老文明号事迹材料
2014/01/16 职场文书
高中语文教学反思
2014/01/16 职场文书
《姥姥的剪纸》教学反思
2014/02/25 职场文书
奥利奥广告词
2014/03/20 职场文书
今冬明春火灾防控工作方案
2014/05/29 职场文书
企业消防安全责任书
2014/07/23 职场文书
2015年大学班长个人工作总结
2015/04/24 职场文书
文艺晚会开场白
2015/05/29 职场文书
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL