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对象的行为像静态方法,在实例属性查找过程中不会转换为绑定方法。