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实现的最近最少使用算法
Jul 10 Python
Python批量查询域名是否被注册过
Jun 21 Python
Python进阶之尾递归的用法实例
Jan 31 Python
Python拼接字符串的7种方法总结
Nov 01 Python
Django学习笔记之为Model添加Action
Apr 30 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
Python基本语法之运算符功能与用法详解
Oct 22 Python
tensorflow 限制显存大小的实现
Feb 03 Python
Pytorch之Tensor和Numpy之间的转换的实现方法
Sep 03 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
Python的flask接收前台的ajax的post数据和get数据的方法
Apr 12 Python
python自动计算图像数据集的RGB均值
Jun 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
SONY SRF-M100的电路分析
2021/03/02 无线电
测试您的 PHP 水平的题目
2007/05/30 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
php文件类型MIME对照表(比较全)
2016/10/07 PHP
JavaScript入门学习书籍推荐
2008/06/12 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
基于js disabled=&quot;false&quot;不起作用的解决办法
2013/06/26 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
JS将表单导出成EXCEL的实例代码
2013/11/11 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
JavaScript事件详细讲解
2016/06/27 Javascript
探索Javascript中this的奥秘
2016/12/11 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
详解Vue-cli 创建的项目如何跨域请求
2017/05/18 Javascript
extjs简介_动力节点Java学院整理
2017/07/17 Javascript
JS+canvas画一个圆锥实例代码
2017/12/13 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
JS禁用右键、禁用Ctrl+u、禁用Ctrl+s、禁用F12的实现代码
2020/12/01 Javascript
[01:14]TI珍贵瞬间系列(六):冠军
2020/08/30 DOTA
[01:04:09]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第二场 2月2日
2021/03/11 DOTA
python字典改变value值方法总结
2019/06/21 Python
详解python中eval函数的作用
2019/10/22 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
Python2与Python3的区别点整理
2019/12/12 Python
Django单元测试中Fixtures用法详解
2020/02/25 Python
Python paramiko 模块浅谈与SSH主要功能模拟解析
2020/02/29 Python
Giglio德国网上精品店:奢侈品服装和配件
2016/09/23 全球购物
广告创意求职信
2014/03/17 职场文书
高中教师考核方案
2014/05/18 职场文书
本科毕业生求职信
2014/06/15 职场文书
2015年幼儿园保育工作总结
2015/05/12 职场文书
2015初中政教处工作总结
2015/07/21 职场文书
HTML5中的DOCUMENT.VISIBILITYSTATE属性详解
2023/05/07 HTML / CSS