Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能示例
本文實例講述了Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能。分享給大家供大家參考,具體如下:
參數(shù)檢查:1. 參數(shù)的個數(shù);2. 參數(shù)的類型;3. 返回值的類型。
考慮如下的函數(shù):
import html
def make_tagged(text, tag):
return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
顯然我們希望傳遞進來兩個參數(shù),且參數(shù)類型/返回值類型均為str,再考慮如下的函數(shù):
def repeat(what, count, separator) : return ((what + separator)*count)[:-len(separator)]
顯然我們希望傳遞進來三個參數(shù),分別為str,int,str類型,可對返回值不做要求。
那么我們該如何實現(xiàn)對上述參數(shù)要求,進行參數(shù)檢查呢?
import functools
def statically_typed(*types, return_type=None):
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
if len(args) > len(types):
raise ValueError('too many arguments')
elif len(args) < len(types):
raise ValueError('too few arguments')
for i, (type_, arg) in enumerate(zip(types, args)):
if not isinstance(type_, arg):
raise ValueError('argument {} must be of type {}'.format(i, type_.__name__))
result = func(*args, **kwargs)
if return_type is not None and not isinstance(result, return_type):
raise ValueError('return value must be of type {}'.format(return_type.__name__))
return wrapper
return decorator
這樣,我們便可以使用修飾器模板執(zhí)行參數(shù)檢查了:
@statically_typed(str, str, return_type=str)
def make_tagged(text, tag):
return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
@statically_typed(str, int, str)
def repeat(what, count, separator):
return ((what + separator)*count)[:-len(separator)]
注:從靜態(tài)類型語言(C/C++、Java)轉入 Python 的開發(fā)者可能比較喜歡用修飾器對函數(shù)的參數(shù)及返回值執(zhí)行靜態(tài)類型檢查,但這樣做會增加 Python 程序在運行期的開銷,而編譯型語言則沒有這種運行期開銷(Python 是解釋型語言)。
更多關于Python相關內(nèi)容可查看本站專題:《Python函數(shù)使用技巧總結》、《Python數(shù)據(jù)結構與算法教程》、《Python字符串操作技巧匯總》、《Python入門與進階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設計有所幫助。
相關文章
Python Web開發(fā)模板引擎優(yōu)缺點總結
這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點總結,需要的朋友可以參考下2014-05-05
Python實現(xiàn)藍線挑戰(zhàn)特效的示例代碼
在抖音曾經(jīng)火了一陣子的藍線挑戰(zhàn)特效,其原理很簡單。本文將試著用opencv-python實現(xiàn)這個效果,做了攝像頭版本和視頻處理版本,感興趣的可以學習一下2022-10-10
python實現(xiàn)socket客戶端和服務端簡單示例
這篇文章主要介紹了python實現(xiàn)socket客戶端和服務端簡單示例,需要的朋友可以參考下2014-02-02
python?pandas如何使用loc和iloc讀取行數(shù)據(jù)或列數(shù)據(jù)
這篇文章主要給大家介紹了關于python?pandas如何使用loc和iloc讀取行數(shù)據(jù)或列數(shù)據(jù)的相關資料,在學習機器學習的過程中對數(shù)據(jù)進行預處理時避免不了需要使用Pandas進行大量操,需要的朋友可以參考下2023-10-10

