-
functools.partial
作用是在真正调用一个函数之前给这个函数的部分参数赋值,并返回配置好了这些参数的一个新函数(实际上是另外一个函数,只是保留了原函数的签名)
🌰:
def foo(param1, param2):
do_some_thing()
from functools import partial
partial_foo = partial(foo, param1='blahblah')
函数定义:
functools.partial(func, *args, **keywords)
PS: func参数是callable的,不过此方法不支持直接包装类方法,包装类方法的函数请继续往下看
-
functools.reduce
此方法就是Python2中的内建方法reduce,原本在Python2中和map方法是黄金搭档,但是因为Guido的反对,此方法被移入了functools当中,的确有点流放的意思
-
functools.wraps
functools中最知名也绝对是最常用的方法,具体的作用是在自定义装饰器时保留被装饰函数的原本签名信息以及doc信息
🌰:
def normal_decorator(func):
def wrapper(*args, **kwargs):
do_something_before_func()
return func(*args, **kwargs)
return wrapper
# 被normal_decorator包装之后的方法__name__属性为'wrapper'
@normal_decorator
def foo():
...
from functools import wraps
def signature_kept_decorator(func):
@wraps
def wrapper(*args, **kwargs):
do_something_before_func()
return func(*args, **kwargs)
return wrapper
# 被signature_kept_decorator包装的方法__name__属性为'foo'
@signature_kept_decorator
def foo():
...
-
functools.cmp_to_key
在Python2中,排序函数接受一个名为cmp的参数,这个参数接收一个callable对象,一般情况下是一个比较函数,这个cmp参数在Python3中已经不存在了,Python3中的排序比较规则一律通过key参数来比较排序,但是如果一定要使用Python2风格的cmp排序,我们可以使用此方法将比较函数转换成一个key对象传入排序方法中
🌰:
from functools import cmp_to_key
key = cmp_to_key(lambda x, y: x ** 2 - y)
array = [2, 3, -9, 3, 8, 19]
sorted_result = sorted(array, key=key)
-
functools.singledispatch
主要作用是实现泛型函数,根据输入参数的不同类型调用不同的函数
🌰:
from functools import singledispatch
@singledispatch
def func(arg):
print('这是模板函数,没有指定函数的输入类型也会被执行此方法')
print(arg)
@func.register
def _(arg: int):
print('整型数调用此函数')
print(arg)
@func.register
def _(arg: list):
print('数组调用此函数')
print(arg)
# 另外一种定义方式
@func.register(complex)
def _(arg):
print('复数调用此函数')
print(arg)
# 调用方式
func(5)
func([1,2])
-
functools.lru_cache
顾名思义就是按次缓存的实现了,一般是用在重型计算的函数中用来缓存的(当然一定要用在其他方面也是可以的)
🌰:
from functools import lru_cache
# maxsize表示缓存次数,typed为True则将不同类型的输入记为不同的计算
@lru_cache(maxsize=32, typed=True)
def heavy_cal_func(arg):
...
# 调用完之后可以查看cache的命中情况
heavy_cal_func.cache_info()
-
functools.partialmethod
partial装饰器的实例方法版本
🌰:
from functools import partialmethod
class Cell(object):
def __init__(self):
self._alive = False
@property
def alive(self):
return self._alive
def set_state(self, state):
self._alive = bool(state)
set_alive = partialmethod(set_state, True)
set_dead = partialmethod(set_state, False)
-
functools.total_ordering
自动实现比较器方法的工具,一般情况下,如果在Python中要实现自定义类的比较需要实现lt, le, gt, ge以及eq这五个方法,但是人都是懒的,一般情况下比较逻辑肯定都是同一套,如果要写五遍基本差不多的代码才能实现比较是很麻烦的,这时候total_ordering的作用就体现出来了,只需要实现lt, le, gt, ge其中一个以及eq方法,添加了total_ordering装饰器的类就会自动实现其余方法
🌰:
from functools import total_ordering
@total_ordering
class Comparator:
def __init__(self, value):
self.value = value
def __eq__(self, other):
return other.value == self.value
def __ge__(self, other):
return self.value >= other.value