Swift51.com
麦子学院 头像
麦子学院  2017-04-16 18:42

Python学习之functools模块常用函数详解

回复:0  查看:2557  
本文和大家分享的主要是python functools模块的常用函数相关内容,一起来看看吧,希望对大家 学习python有所帮助。
  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 "", line 1, in 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 "", line 1, in TypeError: keyword parameter 'base' was given by position and by name >>> int2('10', base=3) 3 >>> type(int2)
  
  从中可以看出,唯一要注意的是可选参数必须写出参数名。
  2.update_wrapper
  接着是update_wrapper 函数,它可以把被封装函数的 __name__ __module__ __doc__ 和  __dict__ 都复制到封装函数去:
  #-*- 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_orderingclass 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 > bprint aprint sorted([b, a])
  打印结果
  False
  <__main__.student object="" at="" 0x7f16ecb194d0="">[<__main__.student object="" at="" 0x7f16ecb194d0="">,<__main__.student object="" at="" 0x7f16ecb195d0="">]


来源: Linux 视野