在特定的場景下,大量相似的函式需要對引數限定範圍並報錯,如果每個函式裡面寫assertion可能會看起來比較冗雜,所以考慮用裝飾器,看起來更規整點。
主要方案是利用函式的method:func.__code__.co_varnames
提取引數/預設值等實現。
# 規則
defnot_none
(x, i)
:assert x is
notnone
, f' should not take none...'
return
# 裝飾器,不支援疊加多個裝飾器,外層的裝飾器在func.__code__.co_varnames讀取的引數將是底層裝飾器的引數
defpara_checker
(para_single_rule, paras)
:def
(func)
:def__(
*args,
**kwargs)
:for i in paras:
func_para = func.__code__.co_varnames[
:func.__code__.co_argcount]
if i in func_para:
idx = func_para.index(i)
# kwargs check
if i in kwargs.keys():
para_single_rule( kwargs[i]
, i)
# positional check
elif args.__len__()-
1>= idx:
para_single_rule(args[idx]
, i)
# default para check
else
: pos = idx - func_para.__len__()if
(func.__defaults__.__len__(
)>= pos)
: para_single_rule(func.__defaults__[pos]
, i)
return func(
*args,
**kwargs)
return __
# 以下僅對a,b作不能為none的規則限制
@para_checker(not_none,
['a'
,'b'])
deff
(a, e=
1, c=
none):
b = a+d
g = e+b
return g
f(none
)>>
> assertionerror: a should not take none..
.
python裝飾器 如何使用函式裝飾器
問題舉例 有時候我們想為多個函式統一新增某種功能,比如計時統計 記錄日誌,快取運算結果等 我們並不想在每個函式內一一新增完全相同的 有什麼解決方案嗎?定義裝飾器函式,用它在原函式的基礎上生成乙個新增新功能的函式來代替原函式 def memo func cache def wrap args res ...
python裝飾器 函式裝飾器,類裝飾器
只要實現此 模式,這個obj就叫乙個裝飾器 參考 函式裝飾器 例子 def decorator func def inner args,kwargs print before.res func args,kwargs print after.return res return inner decor...
python 裝飾器 函式裝飾器 類裝飾器
python函式裝飾器和類裝飾器筆記.usr bin env python coding utf 8 author ivan file decorators.py version from functools import wraps 裝飾器 目的是為了給函式新增附加功能 1.不帶引數裝飾器 此方式...