import inspect
def f(a,b,c=1):
pass
f_sig = inspect.signature(f)
print(f_sig)#(a, b, c=1)
print(f_sig.parameters)#OrderedDict([('a', <Parameter "a">), ('b', <Parameter "b">), ('c', <Parameter "c=1">)])
print(f_sig.parameters['a'])#a
print(f_sig.parameters['a'].name)#a
print(f_sig.parameters['a'].kind)#POSITIONAL_OR_KEYWORD
print(f_sig.parameters['a'].default)#<class 'inspect._empty'>
print(f_sig.parameters['c'].default)#1
bind_arguments = f_sig.bind(int,str,int)
print(bind_arguments)#<BoundArguments (a=<class 'int'>, b=<class 'str'>, c=<class 'int'>)>
print(bind_arguments.arguments)#OrderedDict([('a', <class 'int'>), ('b', <class 'str'>), ('c', <class 'int'>)])
#綁定部分參數
bind_arguments = f_sig.bind_partial(int,list)
print(bind_arguments)#<BoundArguments (a=<class 'int'>, b=<class 'list'>)>
print(bind_arguments.arguments)#OrderedDict([('a', <class 'int'>), ('b', <class 'list'>)])
inspect.signature函數傳回一個inspect.Signature對象,它有一個parameters屬性,這是一個有序映射,把參數名和inspect.Parameter對象對應起來,各個Paramters屬性他有自己的屬性,例如name,default,kind,特殊的inspect._empty值表示沒有預設值,kind屬性的值是_ParameterKind類中的5個之一,
POSITIONAL_OR_KEYWORD 可以通過定位參數和關鍵字參數傳入的形參
VAR_POSITIONAL定位參數元組
VAR_KEWORD關鍵字參數字典
KEYWORD_ONLY僅限關鍵字參數
POSITIONAL_ONAL僅限定位參數
帶參數的裝飾器
import inspect
def type_assert(*ty_args,**ty_kwargs):
def decorator(func):
func_sig = inspect.signature(func)
bind_type = func_sig.bind_partial(*ty_args,**ty_kwargs).arguments
def wrap(*args,**kwargs):
for name,obj in func_sig.bind(*args,**kwargs).arguments.items():
type_ = bind_type.get(name)
if type_:
if not isinstance(obj,type_):
raise TypeError('%s must be %s' %(name,type_))
return func(*args,**kwargs)
return wrap
return decorator
@type_assert(int,list,str)
def f(a,b,c):
pass
f(5,[],'abc')
# f(5,10,'abc')#TypeError: b must be <class 'list'>
@type_assert(c=str)
def f(a,b,c):
pass
f([],[],5.6)#TypeError: c must be <class 'str'>