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')

最新文章

  1. echo命令
  2. WCF之Binding详解
  3. const用法小结
  4. HDU2047
  5. 使用spring 4.0 + maven 构建超简单的web项目
  6. gdb学习
  7. poj3580 伸展树(区间翻转 区间搬移 删除结点 加入结点 成段更新)
  8. JAVA String作业——动手动脑以及课后实验性问题
  9. 纯js上传控件——fineuploader
  10. Oracle EBS 预警系统管理
  11. find——文件查找命令 linux一些常用命令
  12. Touch事件or手机卫士面试题整理回答(二)
  13. .Net 4.0特性 Tuple元组
  14. Windows 7 USB DVD Download Tool 制作的U盘无法启动安装Windows7 SP1
  15. API测试自动化——基于CDIF的SOA基本功能(实例篇)
  16. ASP.Net MVC 布局页 模板页 使用方法详细说明
  17. VS2010中NET4项目中使用LOG4NET办法
  18. objc写一个NSMutableArray不连续索引替换对象的方法
  19. Linux:Day20(上) openssh和CA
  20. angularjs的路由ui.router

热门文章

  1. LeetCode初级算法--数组01:只出现一次的数字
  2. u盘安装操作系统相关
  3. Halcon一日一练:图像采集设备的基本参数
  4. Halcon一日一练:图像设备介绍
  5. LWIP移植文件介绍
  6. opencv实践::对象提取与测量
  7. 非阻塞IO模型
  8. Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener
  9. Go中http超时问题的排查
  10. JAVA实现扫描线算法