functools 模块提供用于调整或扩展函数和其他可调用对象的工具,而无需完全重写它们。装饰器

partial 类是 functools 模块提供的主要工具, 它可以用来“包装”一个可调用的对象的默认参数。它产生的对象本身是可调用的,可以看作是原生函数。它所有的参数都与原来的相同,并且可以使用额外的位置参数或命名参数来调用。使用 partial 代替 lambda 来为函数提供默认参数,同时保留那些未指定的参数。本文福利:私信回复【PDF】可获取Python电子书一套Partial 对象

下面列子是对 myfunc 方法的两个 partial 对象,show_details() 用于输出partial对象的 func 、 args 和 keywords 属性:

示例中最后调用第一个 partial 对象而没有传递 a 的值,导致异常。

获取函数属性

默认情况下, partial 对象没有 __name__ 和 __doc__ 属性。 这样不利于被装饰的函数进行调试。可以使用 update_wrapper() 从原函数复制或新增属性到 partial 对象。

添加到装饰器的属性在 WRAPPER_ASSIGNMENTS 中定义,而 WRAPPER_UPDATES 列出要修改的值。

其他调用对象

partial适用于所有可调用可对象,并不是仅可用于独立函数。

上面例子使用 MyClass 类的实例的 __call__() 方法创建了partial对象。照样正常工作:

方法和函数

partial() 返回一个可以直接调用的对象, partialmethod() 返回一个可调用的为某个对象准备的未绑定的方法。再下面例子中,同一个独立函数被两次添加到类 MyClass 属性。使用 partialmethod() 生成 method1(), partial() 生成 method2():

method1() 可以被 MyClass 实例调用,和普通类方法一样,实例作为第一个参数传入。method2() 没有被成功绑定为类方法。因此其 self 参数必须显式传入,所以此例抛出 TypeError 异常:

在装饰器中使用

使用装饰器时保持函数的属性信息有时非常有用。但是使用装饰器时难免会损失一些原本的功能信息。所以functools提供了 wraps() 装饰器可以通过 update_wrapper() 将原函数对象的指定属性复制给包装函数对象。

比较

在Python2之前,类中可以定义 __cmp__() 方法,该方法根据对象是否小于、d等于或大于被比较项返回-1、0或1。Python2.1开始引入了 富比较 方法API(__lt__(), __le()__, __eq__(), __ne__(), __gt__() 和 __ge__()),用于执行比较操作返回一个布尔值。Python3中 __cmp__() 放弃支持这些新方法,由 functools 提供工具,以便于编写符合Python3中新的比较需求的类。富比较

富比较API旨在允许具有复杂比较的类以最有效的方式实现每种计算。但是,对于比较相对简单的类,手动创建每种富比较方法没有意义。total_ordering() 类装饰器可以使被装饰的类只需要定义 __lt__(),__le__().__gt__()和__ge__() 中的其中一个和 __eq__(), 剩下的由该装饰器自动提供。这简化了定义所有富比较操作的工作量。

虽然该装饰器能很容易的创建完全有序类型,但衍生出的比较函数执行的可能会更慢,以及产生更复杂的堆栈跟踪。如果性能基准测试表明这是程序的瓶颈,则实现所有六个富比较函数可能会提高速度。排序规则

在Python3中已经废弃了旧时的比较(cmp)函数,因此例如 sorted(),min(),max()等方法不在支持 cmp参数, 但仍然支持key函数。functools提供了 cmp_to_key() 用于将cmp函数转换成key函数。

例如给定一个正整数列表,输出用这些正整数能够拼接成的最大整数。如果是Python2的程序可以是这样:

但Python3的 sort 函数已废弃 cmp 参数,可以使用 cmp_to_key 将cmp函数转换成key函数:

cmp 函数接收两个参数,比较它们,如果小于返回负数,相等返回0,大于返回正数。 key 函数接收一个参数,返回用于排序的键。缓存

lru_cache() 装饰器是 缓存淘汰算法(最近最少使用)的一种实现。其使用函数的参数作为key结果作为value缓存在hash结构中(因此函数的参数必须是hashable),如果后续使用相同参数再次调用将从hash从返回结果。同时装饰器还添加了检查缓存转态方法(cache_info())和清空缓存方法(cache_clear())给函数。

代码中多次调用 demo() 方法。首次调用后结果存在缓存中。cache_info() 返回一个命名元组,包括 hits,misses,maxsize 和 currsize 。当第二次调用时命中缓存的调用将直接返回缓存内容,cache_clear() 用于清空当前缓存。

为了防止缓存在长时间运行的流程中无限制地增长,特别设置了 maxsize 参数, 默认是128,设置为None时,则禁用LRU功能,缓存可以无限增长。同时还提供了 typed 参数,用于设置是否区别参数类型,默认为Fals。如果设置为True,那么类似如 demo(1) 和 demo(1.0) 将被视为不同的值不同的调用。Reduce方法

Python3中取消了全局命名空间中的 reduce() 函数,将 reduced() 放到了 functools 模块中,要使用 reduce() 的话,要先从 functools 中加载。

函数重载

在动态类型的语言(如Python)中,如果需要根据参数的类型执行不同的操作,简单直接的方法就是检查参数的类型。但在行为差异明显的情况下需要分离成单独的函数。 functools 提供 singledispatch() 装饰器注册一组通用函数基于函数的第一个参数的类型自动切换,类似于强类型语言中的函数重载。

被 singledispatch() 装饰的函数是默认实现, 使用其 register() 属性装饰接收其他类型参数的函数。调用时会根据 register() 中注册的类型自动选择实现函数。没有则使用默认实现。

另外再有继承的情况下,当类型没有精确匹配时,将根据继承顺序,选择最接近的类型。

在上面代码中,类D和E没有与任何已注册的泛型函数匹配,所以根据其类的继承顺序进行选择。

python中functools_Python传说中的函数神器functools模块,为你全面解析相关推荐

  1. python中的高阶函数

    python中的高阶函数 文章目录: 1 什么是高阶函数? 1.1 高阶函数:一个函数的`函数名`作为参数传给另外一个函数 1.2 高阶函数:一个函数返回值(return)为另外一个`函数` 2 py ...

  2. python平方数迭代器_对python中的高效迭代器函数详解

    python中内置的库中有个itertools,可以满足我们在编程中绝大多数需要迭代的场合,当然也可以自己造轮子,但是有现成的好用的轮子不妨也学习一下,看哪个用的顺手~ 首先还是要先import一下: ...

  3. python函数分几种_简单了解Python中的几种函数

    python是支持多种范型的语言,可以进行所谓函数式编程,其突出体现在有这么几个函数: filter.map.reduce.lambda.yield lambda lambda函数的使用方法:在lam ...

  4. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...

    Python中str()与repr()函数的区别 from:https://www.jianshu.com/p/2a41315ca47e 在 Python 中要将某一类型的变量或者常量转换为字符串对象 ...

  5. Python编程语言学习:python中与数字相关的函数(取整等)、案例应用之详细攻略

    Python编程语言学习:python中与数字相关的函数(取整等).案例应用之详细攻略 目录 python中与数字相关的函数 1.对小数进行向上取整 1.1.利用numpy库 1.2.利用math库

  6. Python中字符串常用处理函数

    ** Python中字符串常用处理函数 ** 1.len( )函数 用len( )函数计算字符串的长度 2.strip( )函数 删除字符串两边的空白符(包括:'\n'.'\t'.'\r') 注:只能 ...

  7. 【Python】Python中str()和repr()函数的区别

    作用 在 Python 中要将某一类型的变量或者常量转换为字符串对象通常有两种方法,即 str() 或者 repr() . 区别与使用 参考文章:Python 中 str() 和 repr() 函数的 ...

  8. python中比较重要的几个函数_Python 几个重要的内置函数 python中的内置函数和关键字需要背过吗...

    python重要的几个内置函数用法 python内置函数什么用忘不掉的是回忆,继续的是生活,错过的,就当是路过吧.来来往往身边出现很多人,总有一个位置,一直没有变.看看温暖的阳光,偶尔还是会想一想. ...

  9. python items函数用法,Python中dictionary items()系列函数的用法实例

    本文实例讲述了Python中dictionary items()系列函数的用法,对Python程序设计有很好的参考借鉴价值.具体分析如下: 先来看一个示例: import html # availab ...

最新文章

  1. python 利用模板文件生成配置文件
  2. 水稻微生物组时间序列分析2a-相关分析
  3. 办公自动化中工作流过程定义的设计与实现
  4. 使用 NCS2 异步推理——人脸识别
  5. ASP.NET杂谈-一切都从web.config说起(2)(ConfigSections详解-上 )
  6. POJ 2263 floyd思想
  7. Angular实现图片点击缩放组件
  8. Django模板层:内置模板标签if,for in(forloop.counter)with,url,spaceless,autoescape,verbatim,firstof,block,cycle
  9. Coding Interview Guide -- 翻转字符串
  10. 怎样才能打开Tuxera NTFS的主界面?
  11. ios笔试题算法_【2018年最新】iOS面试题之常见算法
  12. 计算机图表公式,通达信的DRAWICON49个图标公式
  13. 使用sql语句直接修改数据库密码的解决方案
  14. 我们雇佣了一只大猴子
  15. HDOJ4699 Editor 栈
  16. MovieClip详解
  17. Java手机验证码的实现
  18. composer 初级使用
  19. 阿里巴巴2018秋招面经之前端岗(1~5面)
  20. V-if 的常见用法

热门文章

  1. 今天工作总结和学习总结
  2. 互联网快讯:北京2022年冬残奥会闭幕;美的云项目签约落地贵安;网宿科技全面升级MSP云服务
  3. 如何利用Docker、AWS和深度学习伪装成一个艺术家
  4. 只身单车游山东(三)
  5. 当心!抢票“神器”偷你信息
  6. git 使用教程(图文并茂)
  7. 还在使用 Windows?我的 70 岁母亲都用了 21 年 Linux
  8. 没有背水一战,腾讯忽然又有梦想了?!
  9. 【游戏分析】《某某仙侠传》BUG之装备秒分解
  10. OpenCascade与三角剖分 笔记