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 相关文章推荐
Python3中常用的处理时间和实现定时任务的方法的介绍
Apr 07 Python
Python实现股市信息下载的方法
Jun 15 Python
Python基于Tkinter的HelloWorld入门实例
Jun 17 Python
Python初学时购物车程序练习实例(推荐)
Aug 08 Python
Tensorflow 训练自己的数据集将数据直接导入到内存
Jun 19 Python
python中ASCII码字符与int之间的转换方法
Jul 09 Python
解决Python selenium get页面很慢时的问题
Jan 30 Python
Python Django基础二之URL路由系统
Jul 18 Python
Pytorch中膨胀卷积的用法详解
Jan 07 Python
python实现信号时域统计特征提取代码
Feb 26 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 Python
详解python网络进程
Jun 15 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
PHP在不同页面间传递Json数据示例代码
2013/06/08 PHP
hadoop常见错误以及处理方法详解
2013/06/19 PHP
总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
2016/09/09 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
基于jQuery的表格操作插件
2010/04/22 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
jquery得到font-size属性值实现代码
2013/09/30 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
ionic在开发ios系统微信时键盘挡住输入框的解决方法(键盘弹出问题)
2016/09/06 Javascript
原生JS版和jquery版实现checkbox的全选/全不选/点选/行内点选(Mr.Think)
2016/10/29 Javascript
javascript自执行函数
2017/02/10 Javascript
vuex学习之Actions的用法详解
2017/08/29 Javascript
AngularJS 中的数据源的循环输出
2017/10/12 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
2018/07/13 jQuery
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
python3利用Dlib19.7实现人脸68个特征点标定
2018/02/26 Python
Python实现的生产者、消费者问题完整实例
2018/05/30 Python
Python一个简单的通信程序(客户端 服务器)
2019/03/06 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
浅谈pycharm使用及设置方法
2019/09/09 Python
pytorch自定义二值化网络层方式
2020/01/07 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
2020/01/10 Python
Tensorflow:转置函数 transpose的使用详解
2020/02/11 Python
python 获取域名到期时间的方法步骤
2021/02/10 Python
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
香港现代设计家具品牌:Ziinlife Furniture
2018/11/13 全球购物
MAC Cosmetics官方网站:魅可专业艺术彩妆
2019/04/10 全球购物
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
关于工作时间玩手机的检讨书
2014/09/18 职场文书
优秀班主任材料
2014/12/16 职场文书
办公室岗位职责范本
2015/04/11 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python