目录
首发于:
最近更新于:
分类: posts

functools模块

partial类

functools模块定义了一个partial类,其输入参数如下所示:

    functools.partial(func, *args, **keywords)

其将返回一个partial对象,其有 __call__ 方法,也就是其可以类似函数进行调用。然后其有 func 属性,作为未来函数的调用; args 属性,作为未来函数的参数; keywords 属性,作为未来函数的可选参数。 简单来说就是partial对原函数对象func进行了封装(所以其特别适合做装饰器), newfun=partial(func,args,keywords) ,使得调用这个newfun对象就好像调用原func一样,只是加上了额外的参数,其中args非可选参数是类似列表append形式,而keywords可选参数或说关键字参数是类似字典update形式。

下面是一个简单的演示例子:

import functools

def fun1(a,b=2):
    print('called fun1 with',a,b)

def show_details(name,f,is_partial=False):
    print(name)
    print(f)
    if is_partial:
        print(f.func)
        print(f.args)
        print(f.keywords)
    else:
        print(f.__name__)

show_details('fun1',fun1)

fun1('fun1 a')

p1 = functools.partial(fun1,'p1 a',b=99)
show_details('p1',p1,True)

p1()

其输出如下:

    fun1
    <function fun1 at 0xb705880c>
    fun1
    called fun1 with fun1 a 2
    p1
    functools.partial(<function fun1 at 0xb705880c>, 'p1 a', b=99)
    <function fun1 at 0xb705880c>
    ('p1 a',)
    {'b': 99}
    called fun1 with p1 a 99

这里的逻辑是首先正常执行fun1,然后将fun用partial封装成p1,新增参数字符串'p1 a'和b=4,后面我们可以看到这个p1的参数都加进去了。然后执行这个p1我们看到了参数的变化。