首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

functools

2.5版本中的新功能。

源代码: Lib / functools.py

functools模块用于高阶函数:作用于或返回其他函数的函数。一般而言,任何可调用对象都可以作为本模块用途的函数来处理。

functools模块定义了以下功能:

functools.cmp_to_key(func)

将旧式比较功能转换为按键功能。使用接受钥匙功能的工具(如sorted()min()max()heapq.nlargest()heapq.nsmallest()itertools.groupby())。此函数主要用作转换为Python 3的程序的转换工具,其中不再支持比较函数。

比较函数是可接受两个参数的任何可调用函数,比较它们,并返回一个负数,小于等于零,或者返回大于等于零的正数。关键函数是可调用的,它接受一个参数并返回另一个值作为排序关键字。

例:

代码语言:javascript
复制
sorted(iterable, key=cmp_to_key(locale.strcoll))  # locale-aware sort order

有关排序示例和简要的排序教程,请参阅对如何排序

2.7版本的新功能。

functools.total_ordering(cls)

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

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

例如:

代码语言:javascript
复制
@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。如果更多的参数被提供给调用,它们被附加到参数。如果提供了其他关键字参数,它们将扩展并覆盖关键字。大致相当于:

代码语言:javascript
复制
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()其中的基本参数默认为两个:

代码语言:javascript
复制
>>> 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)。例如:

代码语言:javascript
复制
>>> 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类中定义的对象的行为与静态方法相似,并且在实例属性查找期间不会转换为绑定方法。

扫码关注腾讯云开发者

领取腾讯云代金券

http://www.vxiaotou.com