這個模塊提供了3個有趣的函數,這裏介紹下其用法。
python
首先是partial函數,它能夠從新綁定函數的可選參數,生成一個callable的partial對象 app
- >>> 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'>
從中能夠看出,惟一要注意的是可選參數必須寫出參數名。
接着是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行賦值語句而已。
最後是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__