Source From Here
functools.partial
functools.partial 通過包裝手法,允許我們"重新定義" 函數簽名. 用一些默認參數包裝一個可調用對象,返回結果是可調用對象,並且可以像原始對像一樣對待. 凍結部分函數位置函數或關鍵字參數,簡化函數,更少更靈活的函數參數調用:
一個簡單範例如下:
應用: 典型的,函數在執行時,要帶上所有必要的參數進行調用。然後,有時參數可以在函數被調用之前提前獲知。這種情況下,一個函數有一個或多個參數預先就能用上,以便函數能用更少的參數進行調用。
functool.update_wrapper
默認 partial 對像沒有 __name__ 和 __doc__ , 這種情況下,對於裝飾器函數非常難以 debug.使用 update_wrapper() , 從原始對象拷貝或加入現有 partial 對象 它可以把被封裝函數的 __name__、module、 __doc__ 和 __dict__ 都複製到封裝函數去(模塊級別常量WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES):
這個函數主要用在裝飾器函數中,裝飾器返回函數反射得到的是包裝函數的函數定義而不是原始函數定義. 一個使用範例如下:
執行結果:
functool.wraps
調用函數裝飾器 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) 的簡寫, 來看一個簡單範例:
執行結果:
functools.reduce
此函數等同於內置函數 reduce() . 用這個的原因是使代碼更兼容 (python3)
functools.cmp_to_key
將老式的比較函數(comparison function)轉化為關鍵字函數(key function)。與接受 key function 的工具一同使用(如 sorted(), min(), max(), heapq.nlargest(), itertools.groupby())。該函數主要用來將程序轉成 Python 3 格式的,因為 Python 3 中不支持比較函數。比較函數是可調用的,接受兩個參數,比較這兩個參數並根據他們的大小關係返回負值、零或正值中的某一個。關鍵字函數也是可調用的,接受一個參數,同時返回一個可以用作排序關鍵字的值。
執行結果:
functools.total_ordering
這是一個 類裝飾器,給定一個類,這個類定義了一個或多個比較排序方法,這個類裝飾器將會補充其餘的比較方法,減少了自己定義所有比較方法時的工作量。被修飾的類必須至少定義 __lt__(), __le__(), __gt__() 或 __ge__() 中的一個,同時,被修飾的類還應該提供 __eq__() 方法。一個簡單範例如下:
執行結果:
functools.partial
functools.partial 通過包裝手法,允許我們"重新定義" 函數簽名. 用一些默認參數包裝一個可調用對象,返回結果是可調用對象,並且可以像原始對像一樣對待. 凍結部分函數位置函數或關鍵字參數,簡化函數,更少更靈活的函數參數調用:
- def partial(func, *args, **keywords):
- def newfunc(*fargs, **fkeywords):
- newkeywords = keywords.copy()
- newkeywords.update(fkeywords)
- return func(*(args + fargs), **newkeywords)
- newfunc.func = func
- newfunc.args = args
- newfunc.keywords = keywords
- return newfunc
應用: 典型的,函數在執行時,要帶上所有必要的參數進行調用。然後,有時參數可以在函數被調用之前提前獲知。這種情況下,一個函數有一個或多個參數預先就能用上,以便函數能用更少的參數進行調用。
functool.update_wrapper
默認 partial 對像沒有 __name__ 和 __doc__ , 這種情況下,對於裝飾器函數非常難以 debug.使用 update_wrapper() , 從原始對象拷貝或加入現有 partial 對象 它可以把被封裝函數的 __name__、module、 __doc__ 和 __dict__ 都複製到封裝函數去(模塊級別常量WRAPPER_ASSIGNMENTS, WRAPPER_UPDATES):
這個函數主要用在裝飾器函數中,裝飾器返回函數反射得到的是包裝函數的函數定義而不是原始函數定義. 一個使用範例如下:
- #!/usr/bin/env python
- def wrap(func):
- def call_it(*args, **kwargs):
- """Wrap func: call_it """
- print "Before call"
- return func(*args, **kwargs)
- return call_it
- @wrap
- def hello():
- """Say hello """
- print "Hello World"
- from functools import update_wrapper
- def wrap2(func):
- def call_it(*args, **kwargs):
- """Wrap func: call_it2"""
- print "Before call"
- return func(*args, **kwargs)
- return update_wrapper(call_it, func)
- @wrap2
- def hello2():
- """ Test hello"""
- print "Hello World2"
- if __name__ == '__main__':
- hello()
- print hello.__name__
- print hello.__doc__
- hello2()
- print hello2.__name__
- print hello2.__doc__
functool.wraps
調用函數裝飾器 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) 的簡寫, 來看一個簡單範例:
- from functools import wraps
- def wrap3(func):
- @wraps(func)
- def call_it(*args, **kwargs):
- """Wrap func: call_it2"""
- print "Before call"
- return func(*args, **kwargs)
- return call_it
- @wrap3
- def hello3():
- """ Test hello 3"""
- print "Hello World3"
- if __name__ == '__main__':
- hello3()
- print hello3.__name__
- print hello3.__doc__
functools.reduce
此函數等同於內置函數 reduce() . 用這個的原因是使代碼更兼容 (python3)
functools.cmp_to_key
將老式的比較函數(comparison function)轉化為關鍵字函數(key function)。與接受 key function 的工具一同使用(如 sorted(), min(), max(), heapq.nlargest(), itertools.groupby())。該函數主要用來將程序轉成 Python 3 格式的,因為 Python 3 中不支持比較函數。比較函數是可調用的,接受兩個參數,比較這兩個參數並根據他們的大小關係返回負值、零或正值中的某一個。關鍵字函數也是可調用的,接受一個參數,同時返回一個可以用作排序關鍵字的值。
- import functools
- class People(object):
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def __str__(self):
- return "%s (%d)" % (self.name, self.age)
- p_list = []
- p_list.append(People('John', 36))
- p_list.append(People('Mark', 20))
- p_list.append(People('Ken', 30))
- p_list.append(People('Peter', 28))
- print "Without sorting:"
- for p in p_list:
- print "\t%s" % (p)
- print "Sorting with age:"
- for p in sorted(p_list, key=lambda p: p.age):
- print "\t%s" % (p)
- print "Sorting with name:"
- for p in sorted(p_list, key=lambda p: p.name):
- print "\t%s" % (p)
functools.total_ordering
這是一個 類裝飾器,給定一個類,這個類定義了一個或多個比較排序方法,這個類裝飾器將會補充其餘的比較方法,減少了自己定義所有比較方法時的工作量。被修飾的類必須至少定義 __lt__(), __le__(), __gt__() 或 __ge__() 中的一個,同時,被修飾的類還應該提供 __eq__() 方法。一個簡單範例如下:
- from functools import total_ordering
- @total_ordering
- class People(object):
- def __init__(self, name, age):
- self.name = name
- self.age = age
- def __str__(self):
- return "%s (%d)" % (self.name, self.age)
- def __eq__(self, op):
- return self.age == op.age and self.name == op.name
- def __lt__(self, op):
- if self.name == op.name:
- return self.age < op.age
- else:
- return self.name < op.name
- p1 = People("Ken", 27)
- p2 = People("Ken", 27)
- print "%s < %s? %s" % (p1, p2, p1 < p2)
- print "%s > %s? %s" % (p1, p2, p1 > p2)
- print "%s <= %s? %s" % (p1, p2, p1 <= p2)
- print "%s >= %s? %s" % (p1, p2, p1 >= p2)
- print "%s == %s? %s" % (p1, p2, p1==p2)
沒有留言:
張貼留言