Python标准库inspect的具体使用方法
作者:再见紫罗兰 发布时间:2023-05-30 08:00:37
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)
来源:http://www.cnblogs.com/linxiyue/p/7989947.html


猜你喜欢
- BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库
- 本文以实例形式介绍了python turtle模块即海龟绘图的使用方法,对于需要进行图形编程的朋友相信会有一定的借鉴价值。python tu
- 从过往MySQL数据库生产环境的维护工作中,总结的一些小经验和知识,未必有多深奥,但是对我们消除隐患,确保MySQL数据库生产环境四个9的作
- 前言声明:python版本3.6,以下讨论的Python也都是适用于3.x版本在实际使用安装python的pip安装 依赖库是非常的便捷的。
- python是免费的么?python是免费的,也就是开源的。编程软件的盈利方式就是你使用它, 用的人越多越值钱。注:Python 是一个高层
- 在使用python做爬虫的过程中,有些页面的的部分数据是通过js异步加载的,js调用接口的请求中有时还带有些加密的参数很难破解无法使用req
- 在cmd控制台内,vue -V 可看到vue-cli脚手架的版本号,现在好多帖子误写成vue版本号。如下图:vue版本号在项目中,找到pac
- 本文描述通过统计分析出医院信息系统需分区的表,对需分区的表选择分区键,即找出包括在你的分区键中的列(表的属性),对大型数据的管理比较有意义,
- 本文实例讲述了JS实现的网页背景闪电闪烁效果代码。分享给大家供大家参考,具体如下:这款JavaScript特效代码可实现网页背景的闪电闪烁特
- 随着网络的普及,基于网络的应用也越来越多。网络数据库就是其中之一。通过一台或几台服务器可以为很多客户提供服务,这种方式给人们带来了很多方便,
- 单表的唯一查询用:distinct多表的唯一查询用:group bydistinct 查询多表时,left join 还有效,全连接无效,在
- Conv2d的简单使用torch 包 nn 中 Conv2d 的用法与 tensorflow 中类似,但不完全一样。在 torch 中,Co
- 语义分割是对图像中的每一个像素进行分类,从而完成图像分割的过程。分割主要用于医学图像领域和无人驾驶领域。和其他算法一样,图像分割发展过程也经
- 前言本文主要给大家介绍了关于python计算时间差(返回天数)的相关资料,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧方法
- 在用爬虫爬取网站数据时,有些站点的一些关键数据的获取需要使用账号登录,这里可以使用requests发送登录请求,并用Session对象来自动
- 说明:原来安装的python为64位,故安装的pyinstaller和打包后的exe都为64位。而64位的exe文件在32位的win7操作系
- 一、前言好不容易女神喊我去看电影,但是她又不知道看啥,那么我当然得准备准备~二、前期准备1、使用的软件python 3.8 开源 免费的 (
- 由于测试环境上面使用的zabbix服务器配置比较低,经常会遇到性能瓶颈(主要是数据库和磁盘I/O等),于是倒逼我使用了一些方式来缓解这些问题
- 本文提供一种方法,通过将字符串编码成Unicode格式,保证数据在展示和传输过程中万无一失。无论客户端浏览器如何改变编码,页面上的编码都不会
- 问题出现与解决Pandas进行数据处理之后,假如想将其转化为json,会出现一个bug,就是中文文字是以乱码存储的,也就是\uXXXXXX的