functools模块

functools模块用于高阶函数:作用于或返回其他函数的函数。一般来说,任何可调用的对象都可以作为这个模块的功能来处理。

functools模块定义了以下功能:

1.functools.cmp_to_key(func):

将旧式的比较函数转换为关键函数。与接受关键功能的工具一起使用,例如sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby()).该函数主要用作将程序转换为Python 3的转换工具,而Python 3不再支持比较函数。比较函数是任何接受两个参数的调用,并对它们进行比较,并返回小于、0表示相等的负数,或者是大于的正数。一个关键函数是一个可调用的,它接受一个参数并返回另一个值作为排序键。

例如:

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

2.functools.total_ordering(cls)

给定一个定义一个或多个比较丰富的比较排序方法的类,这个类装饰器提供其余的。这简化了指定所有可能的丰富比较操作的工作:

这个类必须定义一个__lt__(), __le__(), __gt__(), or __ge__()。另外,该类应该提供__eq__()方法。

例如:

@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()))

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

功能与reduce()相同。在此模块中可以使用它,使编写代码与python3更兼容。

functools.partial(func[,*args][, **keywords])

返回一个新的partial对象,当调用该对象时,它会像func那样使用定位参数args和关键字参数关键字。如果有更多的参数被提供给调用,它们将被追加到args。如果提供了额外的关键字参数,它们将扩展并覆盖关键字。大致相当于:

def partial(func, *args, **keywords):
    def newfunc(*fargs, **fkeywords):
        newkeywords = keywords.copy()
        newkeywords.update(fkeywords)
        return func(*(args + fargs), **newkeywords)
    newfunc.func = func
    newfunc.args = args
    newfunc.keywords = keywords
    return newfunc

partial()用于部分函数应用程序,该应用程序“冻结”函数的某些参数and、/、or关键字,从而生成一个具有简化签名的新对象。例如,partial()可以用来创建一个可调用的行为,它的行为像int()函数,其中基本参数默认为2:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.__doc__ = ‘Convert base 2 string to an int.‘
>>> basetwo(‘10010‘)
18

functools.update_wrapper(wrapper, wrapped[, assigned][, updated])

更新包装器(wrapper)函数,使其看起来像被包装(wrapper)的函数。可选的参数是元组,用来指定原始函数的哪些属性直接被分配到包装器函数上的匹配属性,而包装器函数的属性由原始函数的相应属性更新。

这些参数的默认值是模块级常量WRAPPER_ASSIGNMENTS(它分配给包装器函数的__name__、__module__和__doc__、文档字符串)和WRAPPER_UPDATES(更新包装器函数的__dict__,即实例字典)。

这个函数的主要用途是装饰函数,它封装了修饰过的函数并返回wrapper。如果wrapper函数没有更新,返回函数的元数据将反映包装器定义,而不是原来的函数定义,这通常是不太有用的。

functools.wraps(wrapped[, assigned][, updated])

这是在定义wrapper函数时调用update_wrapper()作为函数装饰器的一个很方便的功能。

它相当于partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated).。

例如:

>>> from functools import wraps
>>> def my_decorator(f):
...     @wraps(f)
...     def wrapper(*args, **kwds):
...         print ‘Calling decorated function‘
...         return f(*args, **kwds)
...     return wrapper
...
>>> @my_decorator
... def example():
...     """Docstring"""
...     print ‘Called example function‘
...
>>> example()
Calling decorated function
Called example function
>>> example.__name__
‘example‘
>>> example.__doc__
‘Docstring‘

如果不使用这个decorator工厂,示例函数的名称将是‘wrapper‘,原始示例()的docstring将会丢失。

partial对象

partial对象是由partial()创建的可调用对象。它们有三个只读属性:

partial.func

可调用的对象或函数。对部分对象的调用将通过新的参数和关键字被转发到func。

partial.args

将被预先处理的位置参数的最左侧的位置参数,提供给部分对象调用。

partial.keywords

在调用部分对象时将提供的关键字参数。

partial对象类似于函数对象,因为它们是可调用的、弱引用的,并且可以具有属性。有一些重要的区别。例如,__name__和__doc__属性不是自动创建的。另外,类中定义的partial对象的行为像静态方法,在实例属性查找过程中不会转换为绑定方法。

原文地址:https://www.cnblogs.com/zhongguiyao/p/8214692.html

时间: 2024-10-20 05:36:37

functools模块的相关文章

python functools模块

functools.partial 作用: functools.partial 通过包装手法,允许我们 "重新定义" 函数签名 用一些默认参数包装一个可调用对象,返回结果是可调用对象,并且可以像原始对象一样对待 冻结部分函数位置函数或关键字参数,简化函数,更少更灵活的函数参数调用 #args/keywords 调用partial时参数 def partial(func, *args, **keywords): def newfunc(*fargs, **fkeywords): newk

Python面向切面编程-语法层面和functools模块

1,Python语法层面对面向切面编程的支持(方法名装饰后改变为log) __author__ = 'Administrator' import time def log(func): def wrapper(*args): start = time.time() func(args) end =time.time() print 'func used time is :', end - start return wrapper @log def reg(args): print 'welcom

Python标准库--functools模块

functools模块:管理函数的工具 partial对象:包装原函数,提供默认值 import functools # 原函数 def myfunc(a, b=2): """Docstring for myfunc().""" print(' called myfunc with:', a, b) return # 输出函数 def show_details(name, f, is_partial=False): print(name) pri

python 装饰器和 functools 模块

转自:http://blog.jkey.lu/2013/03/15/python-decorator-and-functools-module/ 什么是装饰器? 在 python 语言里第一次看到装饰器不免让人想到设计模式中的装饰模式——动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活. 好吧,python 中的装饰器显然和装饰模式毫无关系.那 python 中的装饰器到底是什么呢? 简而言之,装饰器提供了一种方法,在函数和类定义语句的末尾插入自动运行代码.pyth

关于functools模块的wraps装饰器用途

测试环境:Python3.6.2 + win10 +  Pycharm2017.3 装饰器之functools模块的wraps的用途: 首先我们先写一个装饰器 # 探索functools模块wraps装饰器的用途 from functools import wraps def trace(func): """ 装饰器 """ # @wraps(func) def callf(*args, **kwargs): """

python中的functools模块

functools模块可以作用于所有的可以被调用的对象,包括函数 定义了__call__方法的类等 1 functools.cmp_to_key(func) 将比较函数(接受两个参数,通过比较两个参数的大小返回负值,0,或者正数)转换为key function(返回一个值用来比较或者排序的可调用对象), 例如: sorted(iterable, functools.cmp_to_key(locale.strcoll)) def cmp1(n1, n2): return n1 - n2 a = [

python 之 functools模块

functools模块用于高阶函数:作用于或返回其他函数的函数.一般而言,任何可调用对象都可以作为本模块用途的函数来处理. 官方文档已经有了详尽的介绍,这里就不在复述,详情请见:官方文档 .这里主要介绍下 partial. partial 详解 functools.partial返回的是一个可调用的partial对象,使用方法是partial(func,*args,**kw),func是必须要传入的,而且至少需要一个args或是kw参数. from functools import partia

Python的functools模块

这个模块提供了3个有趣的函数,这里介绍下其用法. 首先是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 >>> i

operator模块和functools模块

operator模块 在函数式编程中,经常需要把算术运算符当作函数使用.例如,不使用 递归计算阶乘.求和可以使用 sum 函数,但是求积则没有这样的函数. 我们可以使用 reduce 函数(5.2.1 节是这么做的),但是需要一个函数 计算序列中两个元素之积.示例 5-21 展示如何使用 lambda 表达式解决 这个问题. 示例 5-21 使用 reduce 函数和一个匿名函数计算阶乘 from functools import reduce def fact(n): return reduc