inspect python模块_python常用模块-inspect模块

#判断模块、框架、类、函数的方法,和type返回的类型是一样的,只是这里是判断

inspect.getmodulename(path) 获取模块名称

inspect.ismodule(object) 是不是个模块

inspect.isclass(object) 是不是个类

inspect.ismethod(object) 是不是一个方法

inspect.isfunction(object) 是不是一个函数

inspect.isgeneratorfunction(object) 是不是一个生成器函数

inspect.isgenerator(object) 是不是一个生成器

inspect.iscoroutinefunction(object) 是不是一个协程函数

inspect.getsource(object) 获取对象的源码(并不会解析装饰器原码)

inspect.getsourcelines(object) 代码块,每行一个元素,组成数组#signature 类 函数的签名信息:它包含了了函数的函数名、它的参数类型,它所在的类和名称空间及其他信息#signature.parameters 里面存放的是函数的参数注解和返回值注解,组成的有序字典#参数注解常用的方法有:

empty 等同于inspect._empty表示一个参数没有被类型注释

name 参数的名称

default 参数的默认值,如果一个参数没有默认值,这个属性的值为inspect.empty

annotation 参数的注解类型,如果参数没有定义注解,这个属性的值为inspect.empty

kind 参数的类型#参数类型

_POSITIONAL_ONLY = _ParameterKind.POSITIONAL_ONLY #位置参数_only

_POSITIONAL_OR_KEYWORD = _ParameterKind.POSITIONAL_OR_KEYWORD #位置或关键字参数

_VAR_POSITIONAL = _ParameterKind.VAR_POSITIONAL #可变位置参数

_KEYWORD_ONLY = _ParameterKind.KEYWORD_ONLY #keyword-only参数

_VAR_KEYWORD = _ParameterKind.VAR_KEYWORD #可变关键字参数#获取对象的参数签名

>>> importinspect>>> defadd(x:int,y:int):

...return x+y>>> sig =inspect.signature(add)>>> params =sig.parameters>>> print(params)

OrderedDict([('x', ), ('y', )])>>> params['x'].annotation #如果没有定义x的参数注解,那么这里就是inspect._empty

#案例检查参数

importinspectimportfunctoolsdef check(fn): #这个装饰器只能用于函数,不能用于类方法

@functools.wraps(fn)def warpper(*args, **kwargs):

sig= inspect.signature(fn) #获取fn的参数

params = sig.parameters #有序字典,OrderedDict([('x', ), ('y', )])

values =list(params.values())for i,j inenumerate(args):if values[i].annotation != inspect._empty and notisinstance(j, values[i].annotation):raise TypeError("you must input {}".format(values[i].annotation))for k,v inkwargs.items():if params[k].annotation != inspect._empty and not notisinstance(v,params[k].annotation):raise TypeError("you must input {}".format(params[k].annotation))return fn(*args, **kwargs)returnwarpper

@checkdefadd(x:int,y:int):return x+yprint(add(1,2))#实例传参的校验方法(这里不检查*args和**kwargs里面的参数,只针对__init__)

defcheck_params_cls(func):

self= func.pop('self')

params_attr= inspect.getfullargspec(self.__init__.__func__).annotations #获取该实例的签名信息

attr_dict = params_attr.annotations #获取参数名称和类型组成的字典

if params_attr.args[1:]: #获取传入的参数名称

for i inattr_dict.keys():if notisinstance(func[i], attr_dict[i]):raise TypeError('you {} must input {}'.format(func[i], attr_dict[i]))else:

logger.info('实例没有初始化参数,或者是通过不定长参数来进行传参的')classCar():def __init__(self, car_name, car_v: int = 100, car_gas: int = 800, car_fuel: (int, float) = 0.5, *args, **kwargs):

check_params_cls(locals())#通过传入参数来进行判断

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值