functools
functools — Higher-order functions and operations on callable objects
2.5版本中的新功能。
源代码:
Lib / functools.py
该functools
模块用于高阶函数:作用于或返回其他函数的函数。一般而言,任何可调用对象都可以作为本模块用途的函数来处理。
该functools
模块定义了以下功能:
functools.cmp_to_key(func)
将旧式比较功能转换为按键功能。使用接受钥匙功能的工具(如sorted()
,min()
,max()
,heapq.nlargest()
,heapq.nsmallest()
,itertools.groupby()
)。此函数主要用作转换为Python 3的程序的转换工具,其中不再支持比较函数。
比较函数是可接受两个参数的任何可调用函数,比较它们,并返回一个负数,小于等于零,或者返回大于等于零的正数。关键函数是可调用的,它接受一个参数并返回另一个值作为排序关键字。
例:
sorted(iterable, key=cmp_to_key(locale.strcoll)) # locale-aware sort order
有关排序示例和简要的排序教程,请参阅对如何排序。
2.7版本的新功能。
functools.total_ordering(cls)
给定一个定义一个或多个比较排序方法的类,这个类装饰器提供剩余的。这简化了指定所有可能的丰富比较操作的工作:
这个类必须定义之一__lt__()
,__le__()
,__gt__()
,或__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()))
2.7版本的新功能。
functools.reduce(function, iterable[, initializer])
这与功能相同reduce()
。它在本模块中可用,以允许编写更多与Python 3向前兼容的代码。
2.6版本中的新功能。
functools.partial(func[,*args][, **keywords])
返回一个新的partial
对象,当被调用时,它的行为就像调用参数
args
和关键字
参数
关键字的func
。如果更多的参数
被提供给调用,它们被附加到参数
。如果提供了其他关键字
参数
,它们将扩展并覆盖关键字
。大致相当于:
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()
其中的基本
参数默认为两个:
>>> 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_ASSIGNMENTS
(分配给包装
函数的___name__ ,
__module__ 和
__doc__ ,文档字符串)和_WRAPPER_UPDATES
(它更新包装
函数的___dict__,
即实例字典)。
该函数的主要用途是装饰器函数,它包装装饰后的函数并返回包装器。如果包装函数未更新,则返回的函数的元数据将反映包装器定义而不是原始函数定义,这通常不太有用。
functools.wraps(wrapped[, assigned][, updated])
这是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'
如果没有使用这个装饰器工厂,示例函数的名称应该是这样'wrapper'
,并且原始文档字符串example()
已经丢失。
1.部分对象
partial
对象是由可创建的可调用对象partial()
。他们有三个只读属性:
partial.func
可调用的对象或函数。调用partial
对象将被转发给func
新的参数和关键字。
partial.args
将被提供给partial
对象调用的位置参数前置的最左边的位置参数。
partial.keywords
partial
调用对象时将提供的关键字参数。
partial
对象就像function
对象一样可以被调用,弱引用,并且可以有属性。有一些重要的区别。例如,__name__
和__doc__
属性不会自动创建。此外,partial
类中定义的对象的行为与静态方法相似,并且在实例属性查找期间不会转换为绑定方法。