>  기사  >  백엔드 개발  >  Python의 functools 모듈에 있는 공통 기능 분석

Python의 functools 모듈에 있는 공통 기능 분석

高洛峰
高洛峰원래의
2017-03-01 13:50:241609검색

1.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(&#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;>

여기서 볼 수 있듯이, 주의할 점은 선택적 매개변수에는 매개변수 이름을 반드시 써야 한다는 점입니다.

2.update_wrapper
다음에는 캡슐화된 함수의 __name__, __module__, __doc__ 및 __dict__를 캡슐화 함수에 복사할 수 있는 update_wrapper 함수가 있습니다.

#-*- 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__

결과:

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

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

하지만 별로 쓸모는 없고 결국은 덜할 뿐 방금 4줄의 할당문을 작성했습니다.

3.wraps
그리고 update_wrapper도 캡슐화하는 Wraps 기능이 있습니다.

#-*- 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 결과는 여전히 동일합니다.

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

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

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>]


더 보기 Python에서 functools 모듈의 공통 기능 분석과 관련된 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.