9.8. functools-可调用对象的高阶函数和操作

2.5 版的新Function。

源代码: Lib/functools.py


functools模块用于高阶函数:作用于或返回其他函数的函数。通常,就此模块而言,任何可调用对象都可以视为函数。

functools模块定义以下Function:

比较函数是可以接受两个参数,对其进行比较并返回小于(小于)的负数,等于(等于)的零或大于(大于)的正数的任何可调用函数。键函数是一个可调用函数,它接受一个参数并返回另一个值用作排序键。

Example:

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

有关排序示例和简短的排序教程,请参见排序方式

2.7 版的新Function。

该类必须定义lt()le()gt()ge()之一。另外,该类应提供eq()方法。

For example:

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

2.7 版的新Function。

2.6 版的新Function。

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()用于部分函数应用程序,该应用程序“冻结”函数的参数和/或关键字的某些部分,从而生成具有简化签名的新对象。例如,partial()可用于创建行为类似于int()函数的可调用对象,其中* base *参数默认为两个:

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

此函数的主要用途是在decorator函数中,该函数包装装饰后的函数并返回包装器。如果包装器函数未更新,则返回的函数的元数据将反映包装器定义,而不是原始函数定义,这通常会有所帮助。

>>> 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'

如果不使用此装饰器工厂,则示例函数的名称将为'wrapper',而原始example()的文档字符串将丢失。

9.8.1. 部分对象

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

partial对象类似于function对象,因为它们是可调用的,弱引用的,并且可以具有属性。有一些重要的区别。例如,不会自动创建name__doc__属性。同样,在类中定义的partial对象的行为类似于静态方法,并且在实例属性查找期间不会转换为绑定方法。

首页