Python中functools模組的常用函數解析,pythonfunctools

來源:互聯網
上載者:User

Python中functools模組的常用函數解析,pythonfunctools

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函數,它可以把被封裝函數的__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>]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.