Python的functools模塊

這個模塊提供了3個有趣的函數,這裏介紹下其用法。

python

首先是partial函數,它能夠從新綁定函數的可選參數,生成一個callable的partial對象 app

  1. >>> int('10'# 實際上等同於int('10', base=10)和int('10', 10)  
  2. 10  
  3. >>> int('10'2# 其實是int('10', base=2)的縮寫  
  4. 2  
  5. >>> from functools import partial  
  6. >>> int2 = partial(int, 2# 這裏我沒寫base,結果就出錯了  
  7. >>> int2('10')  
  8. Traceback (most recent call last):  
  9.   File "<stdin>", line 1in <module>  
  10. TypeError: an integer is required  
  11. >>> int2 = partial(int, base=2# 把base參數綁定在int2這個函數裏  
  12. >>> int2('10'# 如今缺省參數base被設爲2了  
  13. 2  
  14. >>> int2('10'3# 沒加base,結果又出錯了  
  15. Traceback (most recent call last):  
  16.   File "<stdin>", line 1in <module>  
  17. TypeError: keyword parameter 'base' was given by position and by name  
  18. >>> int2('10', base=3)  
  19. 3  
  20. >>> type(int2)  
  21. <type 'functools.partial'>  

從中能夠看出,惟一要注意的是可選參數必須寫出參數名。

接着是update_wrapper函數,它能夠把被封裝函數的__name__、__module__、__doc__和 __dict__都複製到封裝函數去:
函數

  1. #-*- coding: gbk -*-  
  2.   
  3. def thisIsliving(fun):  
  4.   def living(*args, **kw):  
  5.     return fun(*args, **kw) + '活着就是吃嘛。'  
  6.   return living  
  7.  
  8. @thisIsliving  
  9. def whatIsLiving():  
  10.   "什麼是活着"  
  11.   return '對啊,怎樣纔算活着呢?'  
  12.   
  13. print whatIsLiving()  
  14. print whatIsLiving.__doc__  
  15.   
  16. print  
  17.   
  18. from functools import update_wrapper  
  19. def thisIsliving(fun):  
  20.   def living(*args, **kw):  
  21.     return fun(*args, **kw) + '活着就是吃嘛。'  
  22.   return update_wrapper(living, fun)  
  23.  
  24. @thisIsliving  
  25. def whatIsLiving():  
  26.   "什麼是活着"  
  27.   return '對啊,怎樣纔算活着呢?'  
  28.   
  29. print whatIsLiving()  
  30. print whatIsLiving.__doc__  

結果:
對啊,怎樣纔算活着呢?活着就是吃嘛。
None

對啊,怎樣纔算活着呢?活着就是吃嘛。
什麼是活着
不過也沒多大用處,畢竟只是少寫了4行賦值語句而已。

最後是wraps函數,它將update_wrapper也封裝了進來:

[python]  view plain copy
  1. #-*- coding: gbk -*-  
  2.   
  3. from functools import wraps  
  4.   
  5. def thisIsliving(fun):  
  6.   @wraps(fun)  
  7.   def living(*args, **kw):  
  8.     return fun(*args, **kw) + '活着就是吃嘛。'  
  9.   return living  
  10.  
  11. @thisIsliving  
  12. def whatIsLiving():  
  13.   "什麼是活着"  
  14.   return '對啊,怎樣纔算活着呢?'  
  15.   
  16. print whatIsLiving()  
  17. print whatIsLiving.__doc__  
相關文章
相關標籤/搜索