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设计模式中的代理模式与模板方法模式编程
Feb 02 Python
Python使用matplotlib绘制多个图形单独显示的方法示例
Mar 14 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
pyqt实现.ui文件批量转换为对应.py文件脚本
Jun 19 Python
利用Python实现kNN算法的代码
Aug 16 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
Python map及filter函数使用方法解析
Aug 06 Python
Python APScheduler执行使用方法详解
Dec 10 Python
Python+kivy BoxLayout布局示例代码详解
Dec 28 Python
解决Pytorch中关于model.eval的问题
May 22 Python
python 爬取吉首大学网站成绩单
Jun 02 Python
Python字典和列表性能之间的比较
Jun 07 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 超链接 抓取实现代码
2009/06/29 PHP
PHP获取php,mysql,apche的版本信息示例代码
2014/01/16 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
PHP进程同步代码实例
2015/02/12 PHP
在线编辑器中换行与内容自动提取
2009/04/24 Javascript
jquery 中多条件选择器,相对选择器,层次选择器的区别
2012/07/03 Javascript
利用了jquery的ajax实现二级联互动菜单
2013/12/02 Javascript
基于iframe实现类似于ajax的页面无刷新
2014/05/31 Javascript
基于js实现微信发送好友如何分享到朋友圈、微博
2015/11/30 Javascript
很全面的JavaScript常用功能汇总集合
2016/01/22 Javascript
js实现分割上传大文件
2016/03/09 Javascript
knockoutjs模板实现树形结构列表
2017/07/31 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
浅析node Async异步处理模块用例分析及常用方法介绍
2017/11/17 Javascript
vue页面切换到滚动页面显示顶部的实例
2018/03/13 Javascript
微信小程序云开发之模拟后台增删改查
2019/05/16 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
python调用shell的方法
2013/11/20 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
Python排序搜索基本算法之希尔排序实例分析
2017/12/09 Python
Python排序搜索基本算法之插入排序实例分析
2017/12/11 Python
Python使用logging模块实现打印log到指定文件的方法
2018/09/05 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
python实现桌面托盘气泡提示
2019/07/29 Python
基于Python的OCR实现示例
2020/04/03 Python
python 实现压缩和解压缩的示例
2020/09/22 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
全球最大的服务市场:Fiverr
2017/01/03 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
幼儿园亲子活动方案
2014/01/29 职场文书
幼儿园国庆节活动方案
2014/02/01 职场文书
西式婚礼主持词
2014/03/13 职场文书
《埃及的金字塔》教学反思
2014/04/07 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书