functools模块

functools模块

functools模块包含能够创建高阶函数,函数式编程和装饰器的函数和装饰器

partial

partial(function [,*args [,**kwargs]])	

创建一个类似函数的对象partial,当调用该对象时,会使用参数来调用函数function

例:

#!/usr/bin/python3
# -*- coding:utf-8 -*-
import functools
def add(m,n):
    print(m+n)

if __name__=="__main__":
    f = functools.partial(add,m=3)
    for i in range(5):
        f(n=i)

结果:

3
4
5
6
7

在使用partial对象提到常规函数时,得到的结果与使用常规函数的结果不不完全一致。例如,在类定义中使用partial(),那么该函数的行为类似于静态方法,而不是实例方法

reduce

reduce(function, items [, inital])

向可迭代的items中的项渐增地应用函数function,并返回一个值。

例:

#!/usr/bin/python3
# -*- coding:utf-8 -*-
import functools
def add(m,n):
    return m+n

if __name__=="__main__":
    f = functools.reduce(add, [1,2,3,4],5)
    print(f)

结果:

15

update_wrapper

update_wrapper(wrapper, wrapped [, assigned [, updated]])

这是一个使用工具函数,在编写装饰器的时很有用,将函数wrapped的属性赋值到包装饰器函数wrapper,使包装的函数类似于原始函数。assigned是要复制的属性元组,默认设置为(‘__name__’,'__module__','__doc__')。

updated是一个元组,包含一些函数属性名称,这些函数属性时字典并且需要将它们的值合并到包装器中,默认情况下是('__dict__')

#!/usr/bin/python3
# -*- coding:utf-8 -*-
def wrap(func):
    def call_it(*args,**kwargs):
        """wrap func: call_it"""
        print('before call')
        return func(*args,**kwargs)
    return call_it
 
@wrap
def hello():
    """say hello"""
    print("hello world")
 
from functools import update_wrapper
def wrap2(func):
    def call_it(*args, **kwargs):
        """wrap func: call_it2"""
        print('before call')
        return func(*args, **kwargs)
    return update_wrapper(call_it, func)
 
@wrap2
def hello2():
    """test hello"""
    print('hello world2')
 
if __name__ == '__main__':
    hello()
    print(hello.__name__)
    print(hello.__doc__)
 
    print()
    hello2()
    print(hello2.__name__)
    print(hello2.__doc__)

结果:

before call
hello world
call_it
wrap func: call_it

before call
hello world2
hello2
test hello

wraps

wraps(function [, assigned [, updated]])

一个装饰器,在它所应用的函数上执行于update.wrapper()相同的任务

例:未使用wraps装饰器

def aaa(func):
    def bbb(*args, **kwargs):
        print("****************************")
        func(*args, **kwargs)
        print("****************************")
    return bbb

@aaa
def ccc():
    print("aaaaaaaaaaaaaaaaaaaaaaaaaaa")

if __name__ == '__main__':
    ccc()
    print(ccc.__name__)

结果:

****************************
aaaaaaaaaaaaaaaaaaaaaaaaaaa
****************************
bbb   # 函数ccc的__name__打印为bbb

使用wraps装饰器

from functools import wraps
def aaa(func):
    @wraps(func)
    def bbb(*args, **kwargs):
        print("****************************")
        func(*args, **kwargs)
        print("****************************")
    return bbb

@aaa
def ccc():
    print("aaaaaaaaaaaaaaaaaaaaaaaaaaa")

if __name__ == '__main__':
    ccc()
    print(ccc.__name__)

结果:

****************************
aaaaaaaaaaaaaaaaaaaaaaaaaaa
****************************
ccc   #函数ccc的__name__打印为ccc
posted @ 2021-05-06 23:35  静心&得意  阅读(87)  评论(0编辑  收藏  举报