我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

python代码,如何理解functools类中的wraps和partial函数?从目前的情况来看,functools类中的方法,都是一些非常神奇的函数,每个都具有非常神奇的功能。本文中,对其中的wrapspartial进行一下了解。

苏南大叔:python代码,如何理解functools中的wraps和partial函数? - functools
python代码,如何理解functools中的wraps和partial函数?(图2-1)

大家好,这里是苏南大叔的平行空间笔记本博客,这里记录苏南大叔和计算机代码的故事。wraps方法如何解决__doc____name__的问题?partial方法如何重新包装一个已有函数?

本文测试环境:win10python@3.6.8

wraps

测试代码:

from functools import wraps
def examination2(func):
    @wraps(func)
    def anyname2(*args, **kwargs):
        ''' anydoc2 '''
        print("准备参加考试2")
        func(*args, **kwargs)
        print("通过考试拿到证书2")
    return anyname2
@examination2
def exam(language="西班牙语"):
    ''' doc '''
    print("参加了考试2"+language)
print(exam.__name__, exam.__doc__)

如果没有使用@wraps把装饰器中的闭包给修饰一下的话,那么被装饰器修饰的函数的__name____doc__等变量都会被修改。所以,@wraps就是用于保持被修饰器修饰的某些函数的某些系统变量的。
具体内容,可以参考下面的链接:

partial

这个partial也是个很神奇的方法,它可以对已有的函数,传入部分参数,然后获得一个新的函数。新的函数中再传入剩下的参数,就可以被执行了。是不是特别神奇?

import functools

def fn(args1, args2):
    if(args1 == ""):
        raise TypeError
    return [args1, args2]

t = functools.partial(fn)  # 新的函数t
print(t("a1", "a2"))

t2 = functools.partial(fn, "a1")  # 新的函数t2
print(t2("a2"))

t3 = functools.partial(fn, "a1", "a2")  # 新的函数t3
print(t3())

functools.partial可以传零个参数到所有参数,剩下的参数(如果有)在新的函数里面再次传递。

苏南大叔:python代码,如何理解functools中的wraps和partial函数? - 函数半包装
python代码,如何理解functools中的wraps和partial函数?(图2-2)

上述代码也可以表述为:

from functools import partial
def fn(args1, args2):
    if(args1 == ""):
        raise TypeError
    return [args1, args2]
t = partial(fn)  # 新的函数t
print(t("a1", "a2"))

区别对比:

引入方式使用方式
from functools import partialpartial(fn)
import functoolsfunctools.partial(fn)

相关文章

综述

本文中,主要描述了两个较奇特的函数,分别是wrapspartial,都来自于系统默认的functools类。更多python相关文章,请点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python