Python functools模块学习总结


Posted in Python onMay 09, 2015

文档 地址

functools.partial

作用:

functools.partial 通过包装手法,允许我们 "重新定义" 函数签名

用一些默认参数包装一个可调用对象,返回结果是可调用对象,并且可以像原始对象一样对待

冻结部分函数位置函数或关键字参数,简化函数,更少更灵活的函数参数调用

#args/keywords 调用partial时参数

def partial(func, *args, **keywords):

    def newfunc(*fargs, **fkeywords):

        newkeywords = keywords.copy()

        newkeywords.update(fkeywords)

        return func(*(args + fargs), **newkeywords) #合并,调用原始函数,此时用了partial的参数

    newfunc.func = func

    newfunc.args = args

    newfunc.keywords = keywords

    return newfunc

声明:
urlunquote = functools.partial(urlunquote, encoding='latin1')

当调用 urlunquote(args, *kargs)

相当于 urlunquote(args, *kargs, encoding='latin1')

E.g:

import functools
def add(a, b):

    return a + b
add(4, 2)

6
plus3 = functools.partial(add, 3)

plus5 = functools.partial(add, 5)
plus3(4)

7

plus3(7)

10
plus5(10)

15

应用:

典型的,函数在执行时,要带上所有必要的参数进行调用。

然后,有时参数可以在函数被调用之前提前获知。

这种情况下,一个函数有一个或多个参数预先就能用上,以便函数能用更少的参数进行调用。

functool.update_wrapper

默认partial对象没有__name__和__doc__, 这种情况下,对于装饰器函数非常难以debug.使用update_wrapper(),从原始对象拷贝或加入现有partial对象

它可以把被封装函数的__name__、module、__doc__和 __dict__都复制到封装函数去(模块级别常量WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES)

>>> functools.WRAPPER_ASSIGNMENTS

('__module__', '__name__', '__doc__')

>>> functools.WRAPPER_UPDATES

('__dict__',)

这个函数主要用在装饰器函数中,装饰器返回函数反射得到的是包装函数的函数定义而不是原始函数定义
#!/usr/bin/env python

# encoding: utf-8
def wrap(func):

    def call_it(*args, **kwargs):

        """wrap func: call_it"""

        print 'before call'

        return func(*args, **kwargs)

    return call_it
@wrap

def hello():

    """say hello"""

    print 'hello world'
from functools import update_wrapper

def wrap2(func):

    def call_it(*args, **kwargs):

        """wrap func: call_it2"""

        print 'before call'

        return func(*args, **kwargs)

    return update_wrapper(call_it, func)
@wrap2

def hello2():

    """test hello"""

    print 'hello world2'
if __name__ == '__main__':

    hello()

    print hello.__name__

    print hello.__doc__
    print

    hello2()

    print hello2.__name__

    print hello2.__doc__

得到结果:

before call

hello world

call_it

wrap func: call_it
before call

hello world2

hello2

test hello

functool.wraps

调用函数装饰器partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated)的简写

from functools import wraps

def wrap3(func):

    @wraps(func)

    def call_it(*args, **kwargs):

        """wrap func: call_it2"""

        print 'before call'

        return func(*args, **kwargs)

    return call_it
@wrap3

def hello3():

    """test hello 3"""

    print 'hello world3'

结果
before call

hello world3

hello3

test hello 3

functools.reduce

functools.reduce(function, iterable[, initializer])

等同于内置函数reduce()

用这个的原因是使代码更兼容(python3)

functools.cmp_to_key

functools.cmp_to_key(func)
将老式鼻尖函数转换成key函数,用在接受key函数的方法中(such as sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby())

一个比较函数,接收两个参数,小于,返回负数,等于,返回0,大于返回整数

key函数,接收一个参数,返回一个表明该参数在期望序列中的位置

例如:

sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order

functools.total_ordering

functools.total_ordering(cls)

这个装饰器是在python2.7的时候加上的,它是针对某个类如果定义了__lt__、le、gt、__ge__这些方法中的至少一个,使用该装饰器,则会自动的把其他几个比较函数也实现在该类中
@total_ordering

class Student:

    def __eq__(self, other):

        return ((self.lastname.lower(), self.firstname.lower()) ==

                (other.lastname.lower(), other.firstname.lower()))

    def __lt__(self, other):

        return ((self.lastname.lower(), self.firstname.lower()) <

                (other.lastname.lower(), other.firstname.lower()))

print dir(Student)

得到
['__doc__', '__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__module__']
Python 相关文章推荐
python使用百度翻译进行中翻英示例
Apr 14 Python
python命令行参数解析OptionParser类用法实例
Oct 09 Python
Python迭代器和生成器介绍
Mar 06 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
May 11 Python
python实现合并两个数组的方法
May 16 Python
python中pandas.DataFrame排除特定行方法示例
Mar 12 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
Apr 27 Python
python图形用户接口实例详解
Dec 16 Python
VScode连接远程服务器上的jupyter notebook的实现
Apr 23 Python
详解用Python调用百度地图正/逆地理编码API
Jul 02 Python
python dir函数快速掌握用法技巧
Dec 09 Python
Python打包exe时各种异常处理方案总结
May 18 Python
Python浅拷贝与深拷贝用法实例
May 09 #Python
九步学会Python装饰器
May 09 #Python
Python类属性与实例属性用法分析
May 09 #Python
python回调函数用法实例分析
May 09 #Python
python类和函数中使用静态变量的方法
May 09 #Python
Python实用日期时间处理方法汇总
May 09 #Python
python fabric使用笔记
May 09 #Python
You might like
PHP中Session可能会引起并发问题
2015/06/26 PHP
thinkphp隐藏index.php/home并允许访问其他模块的实现方法
2016/10/13 PHP
PHP+jQuery实现双击修改table表格功能示例
2019/02/21 PHP
基于jquery用于查询操作的实现代码
2010/05/10 Javascript
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
extjs表格文本启用选择复制功能具体实现
2013/10/11 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
JavaScript中使用Callback控制流程介绍
2015/03/16 Javascript
浅谈javascript属性onresize
2015/04/20 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
jquery实现具有收缩功能的垂直导航菜单
2016/02/16 Javascript
微信小程序使用第三方库Underscore.js步骤详解
2016/09/27 Javascript
JS如何实现在页面上快速定位(锚点跳转问题)
2017/08/14 Javascript
Vue子组件向父组件通信与父组件调用子组件中的方法
2018/06/22 Javascript
vue-cli3.0如何使用CDN区分开发、生产、预发布环境
2018/11/22 Javascript
[02:12]2015国际邀请赛 SHOWOPEN
2015/08/05 DOTA
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
python 反向输出字符串的方法
2018/07/16 Python
20行python代码实现人脸识别
2019/05/05 Python
Python Django框架单元测试之文件上传测试示例
2019/05/17 Python
浅谈python3中input输入的使用
2019/08/02 Python
详解python中index()、find()方法
2019/08/29 Python
使用python matploblib库绘制准确率,损失率折线图
2020/06/16 Python
详解Django中views数据查询使用locals()函数进行优化
2020/08/24 Python
做一个能自适应高度的textarea的示例代码
2019/09/06 HTML / CSS
美国领先的家庭健康检测试剂盒提供商:LetsGetChecked
2019/03/18 全球购物
简历的自我评价范文
2014/02/04 职场文书
家长学校实施方案
2014/03/15 职场文书
质监局领导班子对照检查材料思想汇报
2014/09/27 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
html+css 实现简易导航栏功能
2021/04/07 HTML / CSS
JavaScript继承的三种方法实例
2021/05/12 Javascript
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server