Python中functools模块的常用函数解析

1125次阅读  |  发布于5年以前

1.partial
首先是partial函数,它可以重新绑定函数的可选参数,生成一个callable的partial对象:


    >>> int('10') # 实际上等同于int('10', base=10)和int('10', 10) 
    10 
    >>> int('10', 2) # 实际上是int('10', base=2)的缩写 
    2 
    >>> from functools import partial 
    >>> int2 = partial(int, 2) # 这里我没写base,结果就出错了 
    >>> int2('10') 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    TypeError: an integer is required 
    >>> int2 = partial(int, base=2) # 把base参数绑定在int2这个函数里 
    >>> int2('10') # 现在缺省参数base被设为2了 
    2 
    >>> int2('10', 3) # 没加base,结果又出错了 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    TypeError: keyword parameter 'base' was given by position and by name 
    >>> int2('10', base=3) 
    3 
    >>> type(int2) 
    <type 'functools.partial'> 

从中可以看出,唯一要注意的是可选参数必须写出参数名。

2.update_wrapper
接着是update_wrapper函数,它可以把被封装函数的namemoduledocdict都复制到封装函数去:


    #-*- coding: gbk -*- 

    def thisIsliving(fun): 
     def living(*args, **kw): 
      return fun(*args, **kw) + '活着就是吃嘛。' 
     return living 

    @thisIsliving 
    def whatIsLiving(): 
     "什么是活着" 
     return '对啊,怎样才算活着呢?' 

    print whatIsLiving() 
    print whatIsLiving.__doc__ 

    print 

    from functools import update_wrapper 
    def thisIsliving(fun): 
     def living(*args, **kw): 
      return fun(*args, **kw) + '活着就是吃嘛。' 
     return update_wrapper(living, fun) 

    @thisIsliving 
    def whatIsLiving(): 
     "什么是活着" 
     return '对啊,怎样才算活着呢?' 

    print whatIsLiving() 
    print whatIsLiving.__doc__ 

结果:


    对啊,怎样才算活着呢?活着就是吃嘛。
    None

    对啊,怎样才算活着呢?活着就是吃嘛。
    什么是活着

不过也没多大用处,毕竟只是少写了4行赋值语句而已。

3.wraps
再有是wraps函数,它将update_wrapper也封装了进来:


    #-*- coding: gbk -*- 

    from functools import wraps 

    def thisIsliving(fun): 
     @wraps(fun) 
     def living(*args, **kw): 
      return fun(*args, **kw) + '活着就是吃嘛。' 
     return living 

    @thisIsliving 
    def whatIsLiving(): 
     "什么是活着" 
     return '对啊,怎样才算活着呢?' 

    print whatIsLiving() 
    print whatIsLiving.__doc__ 

结果还是一样的:


    对啊,怎样才算活着呢?活着就是吃嘛。
    什么是活着

4.total_ordering
最后至于total_ordering函数则给予类丰富的排序方法,使用装饰器简化了操作。如果使用必须在类里面定义一个lt(),le(), gt(), 或ge()。应该给类添加一个eq() 方法。


    from functools import total_ordering

    @total_ordering
    class Student(object):
      def __init__(self, name):
        self.name = name

      def __eq__(self, other):
        return self.name.lower() == other.name.lower()

      def __lt__(self, other):
        return self.name.lower() < other.name.lower()

    a = Student('dan')
    b = Student('mink')

    print a > b
    print a
    print sorted([b, a])

打印结果


    False
    <__main__.Student object at 0x7f16ecb194d0>
    [<__main__.Student object at 0x7f16ecb194d0>, <__main__.Student object at 0x7f16ecb195d0>]

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8