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'>
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/articles/10665763.html