1. 程式人生 > >python 9-3 如何定義帶引數的裝飾器,提取函式簽名python3 inspect.signature()

python 9-3 如何定義帶引數的裝飾器,提取函式簽名python3 inspect.signature()

9-3 如何定義帶引數的裝飾器

提取函式簽名python3 inspect.signature()
帶引數的裝飾器,也就是根據引數定製化一個裝飾器可以看生成器的工廠
每次呼叫typeassert,返回一個特定的裝飾器,然後用它去裝飾其他函式

from inspect import signature

def f(a,b,c=1):pass
sig = signature(f)
sig.parameters
實現一個對被裝飾的函式的引數型別檢查的裝飾器
from inspect import signature
def typeassert(*ty_args,**ty_kargs)
:
def decorator(func): #func ->a,b #d = {'a':int,'b':str} sig = signature(func) btypes = sig.bind_partial(*ty_args,**ty_kargs).arguments def wrapper(*args,**kargs): #arg in d,instance(arg,d[arg]) for name, obj in sig.bind(*ty_args,**ty_kargs).arguments: if
name in btypes: if not instance(obj,btyes[name]): raise TypeError('"%s" must be "%s"' %(name,btyes[name])) return func(*args,**kargs) return wrapper return decorator @typeassert(int,str,list) def f(a,b,c): print a,b,c