Python标准库inspect的具体使用方法


Posted in Python onDecember 06, 2017

inspect模块用于收集python对象的信息,可以获取类或函数的参数的信息,源码,解析堆栈,对对象进行类型检查等等,有几个好用的方法:

Doc:这样写到

The inspect module provides several useful functions to help get information about live objects such as modules, classes, methods, functions, tracebacks, frame objects, and code objects.

这个模块是针对模块,类,方法,功能等对象提供些有用的方法。

getargspec(func)

返回一个命名元组ArgSpect(args, varargs, keywords, defaults),args是函数位置参数名列表,varargs是*参数名,keywords是**参数名,defaults是默认参数值的元组。

在用__init__参数自动初始化实例属性的实践中,是用字节码对象的co_varnames属性来获取函数的位置参数名的:

def attr_from_locals(locals_dict):
 self = locals_dict.pop('self')
 code = self.__init__.__func__.__code__
 args = code.co_varnames[1:code.co_argcount]
 for k in args:
  setattr(self, k, locals_dict[k])   
class Foo(object):
 def __init__(self, name, color, num=1):
  x = 1
  attr_from_locals(locals())

而当__init__方法使用**特殊参数接收任意数量的关键字参数时,上述代码是不适用的。可行的办法是使用字节码的co_flags属性来判断**参数是否存在。

函数使用*args语法来接受任意数量的位置参数时,co_flags置位0x04,使用**kwargs语法时,置位0x08,函数为一个生成器时,置位0x2000,其它位保留:

>>> def foo(x, *args, **kwargv):
  pass
>>> foo.__code__.co_varnames
('x', 'args', 'kwargv')
>>> foo.__code__.co_flags & 0x04
4
>>> foo.__code__.co_flags & 0x08
8

inspect模块的getargspec()方法正是用此判断来获取函数的特殊参数的。现在可以方便的获取__init__的**参数了:

import inspect
def attr_from_locals(locals_dict):
 self = locals_dict.pop('self')
 args = inspect.getargspec(self.__init__.__func__).args[1:]
 for k in args:
  setattr(self, k, locals_dict[k])
 keywords = inspect.getargspec(self.__init__.__func__).keywords
 if keywords:
  keywords_dict = locals_dict[keywords]
  for k in keywords_dict:
   setattr(self, k, keywords_dict[k])  
class Foo(object):
 def __init__(self, name, **kwargv):
  attr_from_locals(locals())
f = Foo('bar', color='yellow', num=1)
print f.__dict__

结果为:

{'color': 'yellow', 'num': 1, 'name': 'bar'}

对象已经正确的初始化了。

getmembers(object[, predicate])

返回一个包含对象的所有成员的(name, value)列表。返回的内容比对象的__dict__包含的内容多,源码是通过dir()实现的。

predicate是一个可选的函数参数,被此函数判断为True的成员才被返回。

getmodule(object)

返回定义对象的模块

getsource(object)

返回对象的源代码

getsourcelines(object)

返回一个元组,元组第一项为对象源代码行的列表,第二项是第一行源代码的行号

ismodule,isclass,ismethod,isfunction,isbuiltin

一系列判断对象类型的方法,大都是包装了isinstance(object, types.FunctionType)之类语句的函数。

现在可以用类型判断来返回一个类的方法了:

class Foo(object):
 '''Foo doc'''
 def __init__(self, name):
  self.__name = name
 def getname(self):
  return self.__name
inspect.getmembers(Foo, inspect.ismethod)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python dict remove数组删除(del,pop)
Mar 24 Python
python解析文件示例
Jan 23 Python
python学习笔记之调用eval函数出现invalid syntax错误问题
Oct 18 Python
Python实现PS滤镜的旋转模糊功能示例
Jan 20 Python
Pyinstaller将py打包成exe的实例
Mar 31 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Python查找第n个子串的技巧分享
Jun 27 Python
django 中的聚合函数,分组函数,F 查询,Q查询
Jul 25 Python
Pycharm配置PyQt5环境的教程
Apr 02 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
Oct 20 Python
Python下使用Trackbar实现绘图板
Oct 27 Python
读取本地json文件,解析json(实例讲解)
Dec 06 #Python
Python语言描述最大连续子序列和
Dec 05 #Python
python matplotlib坐标轴设置的方法
Dec 05 #Python
详解K-means算法在Python中的实现
Dec 05 #Python
Python实现字符串匹配算法代码示例
Dec 05 #Python
Django实现简单分页功能的方法详解
Dec 05 #Python
Python生成8位随机字符串的方法分析
Dec 05 #Python
You might like
PHP 多维数组的排序问题 根据二维数组中某个项排序
2011/11/09 PHP
php中JSON的使用方法
2015/04/30 PHP
PHP文件与目录操作示例
2016/12/24 PHP
解决Laravel5.2 Auth认证退出失效的问题
2019/10/14 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
jquery实现奇偶行赋值不同css值
2012/02/17 Javascript
javascript实现英文首字母大写
2015/04/23 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
React快速入门教程
2017/01/17 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
JS中获取 DOM 元素的绝对位置实例详解
2018/04/23 Javascript
关于vue的语法规则检测报错问题的解决
2018/05/21 Javascript
通过jquery的ajax请求本地的json文件方法
2018/08/08 jQuery
javascript实现贪吃蛇小练习
2020/07/05 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
[01:15:45]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第一局
2016/02/26 DOTA
[01:06:32]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第一局
2016/02/28 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
Python正则表达式使用范例分享
2016/12/04 Python
Python3实现的旋转矩阵图像算法示例
2019/04/03 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
用Python 爬取猫眼电影数据分析《无名之辈》
2020/07/24 Python
Python 如何展开嵌套的序列
2020/08/01 Python
python 如何调用远程接口
2020/09/11 Python
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
拖鞋店创业计划书
2014/01/15 职场文书
党建示范点实施方案
2014/03/12 职场文书
财产公证书格式
2014/04/10 职场文书
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
个人租房协议书
2014/11/28 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
2015年采购工作总结
2015/04/10 职场文书
运动会通讯稿300字
2015/07/20 职场文书
利用 SQL Server 过滤索引提高查询语句的性能分析
2021/07/15 SQL Server