zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    “上海名媛群”事件,我来说几句
    急于脱手商业地产的酒店式公寓,让我在无锡买了房
    40年产权的商业地产,个人投资者决不能碰
    产权分割商铺,太坑人!
    我的第二故乡 – 武汉
    我的第二故乡
    Consul踢除失效服务和移除Node节点
    合并2个数组为1个无重复元素的有序数组--Go对比Python
    当Prometheus遇到混沌工程
    测试流程规范--测试准入、准出、停止标准、bug优先级定义
  • 原文地址:https://www.cnblogs.com/jingxindeyi/p/14737406.html
Copyright © 2011-2022 走看看