python——inspect模块
2024-08-30 03:20:02
inspect模块常用功能
import inspect # 导入inspect模块
inspect.isfunction(fn) # 检测fn是不是函数
inspect.isgenerator((x for x in range(10))) # 检测是否是生成器
inspect.isclass(int) # 检测int是不是类
inspect.isbuiltin(print) # 检测print是不是内建函数(built-in function)
import random
inspect.ismodule # 检测random是不是模块
我们把其中的inspect . signature(function)拿出来单独分析,如下:
def add(x:int, y:int): # 定义一个函数
return x + y
import inspect
sig = inspect.signature(add) # 获取一个函数的参数签名
print(sig) # (x: int, y: int)
parms = sig.parameters
print(parms) # 打印一个有序字典,字典的key是add函数的形参,字典的values是函数的形参key对应的各种属性,我们学习一下它的annotation属性
# OrderedDict([('x', <Parameter "x: int">), ('y', <Parameter "y: int">)])
print(parms['x'].annotation) # <class 'int'> 形参x的注释类型是int
应用——业务实战
通过上面的分析,我们学到了如何获得一个函数的注释信息,现在我们要实现一个业务:
函数参数类型检查,即在传参调用的时候自动检查传入的实际参数和形参的注释进行对比,如果不同,给出提示。
思路:- 函数参数的检查,最好在函数外,可以想到使用装饰器
- __annotation__属性是一个字典
import inspect
from functools import wraps
def logger(fn):
d = {}
@wraps(fn)
def wrapper(*args, **kwargs):
print(kwargs)
sig = inspect.signature(fn)
params = sig.parameters
print(params)
for i,v in enumerate(params.values()):
d[f'{i}'] = v.annotation
for i,x in enumerate(args):
if d[f'{i}'] == 'inspect._empty' or type(x) == d[f'{i}']:
print(x, '很ok,没问题')
else:
print(x, '类型不对')
for k,v in kwargs.items():
if type(v) == params[k].annotation:
print(v,'ok,可以')
else:
print(v,'不行')
ret = fn(*args, **kwargs)
# print(d)
# print(d['1'])
return ret
return wrapper
@logger
def add(x:str, y:int=7)->int:
return x + y
add(3,y='sdf')
最新文章
- echo命令
- WCF之Binding详解
- const用法小结
- HDU2047
- 使用spring 4.0 + maven 构建超简单的web项目
- gdb学习
- poj3580 伸展树(区间翻转 区间搬移 删除结点 加入结点 成段更新)
- JAVA String作业——动手动脑以及课后实验性问题
- 纯js上传控件——fineuploader
- Oracle EBS 预警系统管理
- find——文件查找命令 linux一些常用命令
- Touch事件or手机卫士面试题整理回答(二)
- .Net 4.0特性 Tuple元组
- Windows 7 USB DVD Download Tool 制作的U盘无法启动安装Windows7 SP1
- API测试自动化——基于CDIF的SOA基本功能(实例篇)
- ASP.Net MVC 布局页 模板页 使用方法详细说明
- VS2010中NET4项目中使用LOG4NET办法
- objc写一个NSMutableArray不连续索引替换对象的方法
- Linux:Day20(上) openssh和CA
- angularjs的路由ui.router