Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能示例
本文實(shí)例講述了Python使用修飾器執(zhí)行函數(shù)的參數(shù)檢查功能。分享給大家供大家參考,具體如下:
參數(shù)檢查:1. 參數(shù)的個(gè)數(shù);2. 參數(shù)的類型;3. 返回值的類型。
考慮如下的函數(shù):
import html def make_tagged(text, tag): return '<{0}>{1}</{0}>'.format(tag, html.escape(text))
顯然我們希望傳遞進(jìn)來兩個(gè)參數(shù),且參數(shù)類型/返回值類型均為str,再考慮如下的函數(shù):
def repeat(what, count, separator) : return ((what + separator)*count)[:-len(separator)]
顯然我們希望傳遞進(jìn)來三個(gè)參數(shù),分別為str,int,str類型,可對返回值不做要求。
那么我們該如何實(shí)現(xiàn)對上述參數(shù)要求,進(jìn)行參數(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)轉(zhuǎn)入 Python 的開發(fā)者可能比較喜歡用修飾器對函數(shù)的參數(shù)及返回值執(zhí)行靜態(tài)類型檢查,但這樣做會(huì)增加 Python 程序在運(yùn)行期的開銷,而編譯型語言則沒有這種運(yùn)行期開銷(Python 是解釋型語言)。
更多關(guān)于Python相關(guān)內(nèi)容可查看本站專題:《Python函數(shù)使用技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié)
這篇文章主要介紹了Python Web開發(fā)模板引擎優(yōu)缺點(diǎn)總結(jié),需要的朋友可以參考下2014-05-05python實(shí)現(xiàn)json文件的增刪改操作方法
這篇文章主要介紹了python實(shí)現(xiàn)json文件的增刪改操作,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06Python實(shí)現(xiàn)藍(lán)線挑戰(zhàn)特效的示例代碼
在抖音曾經(jīng)火了一陣子的藍(lán)線挑戰(zhàn)特效,其原理很簡單。本文將試著用opencv-python實(shí)現(xiàn)這個(gè)效果,做了攝像頭版本和視頻處理版本,感興趣的可以學(xué)習(xí)一下2022-10-10python實(shí)現(xiàn)socket客戶端和服務(wù)端簡單示例
這篇文章主要介紹了python實(shí)現(xiàn)socket客戶端和服務(wù)端簡單示例,需要的朋友可以參考下2014-02-02Python手動(dòng)或自動(dòng)協(xié)程操作方法解析
這篇文章主要介紹了Python手動(dòng)或自動(dòng)協(xié)程操作方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06python?pandas如何使用loc和iloc讀取行數(shù)據(jù)或列數(shù)據(jù)
這篇文章主要給大家介紹了關(guān)于python?pandas如何使用loc和iloc讀取行數(shù)據(jù)或列數(shù)據(jù)的相關(guān)資料,在學(xué)習(xí)機(jī)器學(xué)習(xí)的過程中對數(shù)據(jù)進(jìn)行預(yù)處理時(shí)避免不了需要使用Pandas進(jìn)行大量操,需要的朋友可以參考下2023-10-10