Home  >  Article  >  Backend Development  >  Analysis of common functions in the functools module in Python

Analysis of common functions in the functools module in Python

高洛峰
高洛峰Original
2017-03-01 13:50:241587browse

1.partial

The first is the partial function, which can rebind the optional parameters of the function and generate a callable partial object:

>>> 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(&#39;10&#39;) # 现在缺省参数base被设为2了 
2 
>>> int2(&#39;10&#39;, 3) # 没加base,结果又出错了 
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
TypeError: keyword parameter &#39;base&#39; was given by position and by name 
>>> int2(&#39;10&#39;, base=3) 
3 
>>> type(int2) 
<type &#39;functools.partial&#39;>

As can be seen from this, the only thing to note is that the optional parameter must write the parameter name.

2.update_wrapper
Then there is the update_wrapper function, which can copy the __name__, __module__, __doc__ and __dict__ of the encapsulated function to the encapsulating function:

#-*- coding: gbk -*- 
 
def thisIsliving(fun): 
 def living(*args, **kw): 
  return fun(*args, **kw) + &#39;活着就是吃嘛。&#39; 
 return living 
 
@thisIsliving 
def whatIsLiving(): 
 "什么是活着" 
 return &#39;对啊,怎样才算活着呢?&#39; 
 
print whatIsLiving() 
print whatIsLiving.__doc__ 
 
print 
 
from functools import update_wrapper 
def thisIsliving(fun): 
 def living(*args, **kw): 
  return fun(*args, **kw) + &#39;活着就是吃嘛。&#39; 
 return update_wrapper(living, fun) 
 
@thisIsliving 
def whatIsLiving(): 
 "什么是活着" 
 return &#39;对啊,怎样才算活着呢?&#39; 
 
print whatIsLiving() 
print whatIsLiving.__doc__

Result:

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

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

But it’s not much use, after all, it’s just a little Just wrote 4 lines of assignment statements.

3.wraps
Then there is the wraps function, which also encapsulates update_wrapper:

#-*- coding: gbk -*- 
 
from functools import wraps 
 
def thisIsliving(fun): 
 @wraps(fun) 
 def living(*args, **kw): 
  return fun(*args, **kw) + &#39;活着就是吃嘛。&#39; 
 return living 
 
@thisIsliving 
def whatIsLiving(): 
 "什么是活着" 
 return &#39;对啊,怎样才算活着呢?&#39; 
 
print whatIsLiving() 
print whatIsLiving.__doc__

The result is still the same:

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

4.total_ordering
Finally, the total_ordering function gives a rich sorting method, using decorators simplifies operations. If used, a __lt__(), __le__(), __gt__(), or __ge__() must be defined in the class. An __eq__() method should be added to the class.

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(&#39;dan&#39;)
b = Student(&#39;mink&#39;)

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

Print results

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


##More For articles related to analysis of common functions of the functools module in Python, please pay attention to the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn