分析特定类的python脚本
今天接触了下pyUSB,事先没看对象内部成员资料,直接用python的dir函数看了看pyUSB的内部构成。突然间想到自己可不可以写个简单的脚本,利用dir或其他函数遍历某个对象内部的所有成员,并打印出来成树状图的形式?于是写了如下对象分析程序:
使用方法 :
import matplotlib.pyplot as plt
import AnalysisClass
m = AnalysisClass.AnalysisClass()
m.analysisObject(plt.Arrow, 'plt.Arrow', 'plt.txt', levelEnd=3)
调用analysisObject即可分析matplotlib的pyplot库内部的成员,并把所有成员函数、成员类以及各成员的__doc__前两行作为概述打印出来。上面的plt.Arrow是要分析的对象,’plt.Arrow’是要分析对象的名称字符串,’plt.txt’是用来保存分析结果的文件名,levelEnd用来指定递归的深度。
上面调用得到的结果:

省略若干行

代码概述:
程序核心很简单,就是递归地用dir()函数得到对象的所有成员,对于以下划线开头的内部成员不予处理,其他的如常量(一般全大写)、成员函数、成员类等的名字则保存起来,然后在以这些成员为对象递归地获取下一层的成员列表。
详细程序:
import types
class AnalysisClass:
def __init__(self):
self.level= 0
self.file = None
self.constNum=[]
self.funcNum = [] def _levelTreePrint(self, strs, isConst=False):
levelTab=self.level*4*' '
levelStrHead =[i for i in levelTab]
if self.level != 0:
# strs = str(self.funcNum[-1])+strs
for i in range(self.level):
if (not isConst) and self.funcNum[i] == 1:
continue
else:
levelStrHead[i*4+1] = '|'
levelStrHead[((self.level-1)*4+2):] = ['-','-']
levelStrHead = ''.join(levelStrHead)
levelStr = levelStrHead+strs
else:
levelStr = strs
print levelStr
if self.file != None:
self.file.writelines(levelStr+'\n') # def _isListOrTuple(self, cla):
# if type(cla)==types.ListType or type(cla)==types.TupleType:
# return True
# else:
# return False def _hasAvailableCla(self, cla):
mems = dir(cla)
constMem=[]
claOrFuncMem = []
constMaxLen = 0
funcMaxLen = 0
for i in mems:
lenI = len(i)
if i[0] == '_': # No inner function or inner constants
continue
if i.isupper():
if lenI>constMaxLen:
constMaxLen = lenI
constMem.append(i)
elif i[0:2]!='__' and i[-2:]!='__':# No buildin functions
if lenI>funcMaxLen:
funcMaxLen = lenI
claOrFuncMem.append(i)
return (constMem, constMaxLen, claOrFuncMem, funcMaxLen) def _printConstMem(self, cla, constMem, constMaxLen):
loc_var = locals()
for i in loc_var.iteritems():
if id(i[1]) == id(cla):
cla_loc_name = i[0]
for i in constMem:
tmp = eval(cla_loc_name+'.'+i)
i = i.ljust(constMaxLen+1, ' ')
# if type(tmp)==types.IntType:
# i = i+"(%d)"%tmp
# else:
# i = i+"(NOT AN INT NUMBER)"+str(type(tmp))
i = i + "(%s)"%str(tmp)
self._levelTreePrint(i, isConst=True)
self.constNum[-1] -= 1 def _printClaOrFuncMem(self,cla, cla_name, funcMaxLen, claOrFuncMem):
loc_var = locals()
for i in loc_var.iteritems():
if id(i[1]) == id(cla):
cla_loc_name = i[0]
for i in claOrFuncMem:
iMem = cla_loc_name+'.'+i
iMemReName = cla_name+'.'+i
try:
if None!=eval(iMem):
self._analysisClass(eval(iMem),iMemReName, maxClaNameLen = funcMaxLen)
self.level -= 1
else:
self._levelTreePrint(cla_name.split('.')[-1]+'.'+i+"--'Nothing'")
except Exception,e:
pass
self.funcNum[-1] -= 1 def _analysisClass(self, cla, cla_name, maxClaNameLen = 0):
if hasattr(cla, "__doc__"):
doc = str(cla.__doc__).split('\n')
if len(doc)>=2:
doc = doc[0]+doc[1]
else:
doc = doc[0]
else:
doc = ' ' if self.level!=0 and maxClaNameLen!=0:
sNameTmp = cla_name.split('.')
extraLen = len(sNameTmp[-2])
sName = sNameTmp[-2]+'.'+sNameTmp[-1]
cla_name_tmp = sName.ljust(extraLen+maxClaNameLen+1,' ')
else:
cla_name_tmp = cla_name self._levelTreePrint(cla_name_tmp+':'+str(type(cla))+3*'-'+"\""+doc+"\"")
self.level += 1
if self.level == self.levelEnd:
return
(constMem, constMaxLen, claOrFuncMem, funcMaxLen) = self._hasAvailableCla(cla)
if constMaxLen != 0:
self.constNum.append(len(constMem))
self._printConstMem(cla, constMem, constMaxLen)
self.constNum.pop()
if funcMaxLen != 0:
self.funcNum.append(len(claOrFuncMem))
self._printClaOrFuncMem(cla, cla_name, funcMaxLen, claOrFuncMem)
self.funcNum.pop()
else:
return #===========================================================================
# Analysis the stucture of 'obj'.This function will list out the members of the object as
# a tree.
# @param obj - object,can be class,module,package,etc
# @param obj_name - object name string,should be same to the actual name of 'obj'
# @param file_name - If you want to store the analysis info to a txt file,set this param
# of your file name
# @paramm levelEnd - set the recursion limits.The analysisObject function will recursively
# enum all the members of the 'obj',when the recursion depth equals levelEnd
# the function will stop automatically
#
# Using:
# import AnalysisClass
# import matplotlib.pyplot as plt
# m = AnalysisClass.AnalysisClass()
# m.analysisObject(plt.Annotation, 'plt.Annotation', 'plt.txt', levelEnd=4)
# Written by Liu.2014-07-25
#===========================================================================
def analysisObject(self, obj, obj_name, file_name=None, levelEnd=3):
if file_name != None:
self.file = open(file_name, 'w')
self.levelEnd = levelEnd
self._analysisClass(obj, obj_name, levelEnd)
if self.file !=None:
self.file.close()
分析特定类的python脚本的更多相关文章
- 通过Java调用Python脚本
在进行开发的过程中,偶尔会遇到需要使用Java调用Python脚本的时候,毕竟Python在诸如爬虫,以及科学计算等方面具有天然的优势.最近在工作中遇到需要在Java程序中调用已经写好的Python程 ...
- 基于binlog来分析mysql的行记录修改情况(python脚本分析)
最近写完mysql flashback,突然发现还有有这种使用场景:有些情况下,可能会统计在某个时间段内,MySQL修改了多少数据量?发生了多少事务?主要是哪些表格发生变动?变动的数量是怎 ...
- 使用Python脚本分析你的网站上的SEO元素
撰稿马尼克斯德芒克 上2019年1月, Sooda internetbureau Python就是自动执行重复性任务,为您的其他搜索引擎优化(SEO)工作留出更多时间.没有多少SEO使用Python来 ...
- Java调用Python脚本工具类
[本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...
- 调用其他python脚本文件里面的类和方法
问题描述: 自己编写了若干个Python脚本. 在testC.py里面需要调用testA.py和testB.py里面的若干类和方法.要怎么办? 需要都打包.安装,再去调用吗? 其实不必那么麻烦. 这里 ...
- arcgis python脚本工具实例教程—栅格范围提取至多边形要素类
arcgis python脚本工具实例教程-栅格范围提取至多边形要素类 商务合作,科技咨询,版权转让:向日葵,135-4855_4328,xiexiaokui#qq.com 功能:提取栅格数据的范围, ...
- python脚本分析nginx访问日志
日志格式如下: 223.74.135.248 [11/May/2017:11:19:47 +0800] "POST /login/getValidateCode HTTP/1.1" ...
- ArcGIS使用Python脚本工具
在Pyhton写的一些代码,用户交互不方便,用户体验比较差,不方便重用.在ArcGIS中可以将用写的Python代码导入到ToolBox中,这样用起来就比较方便了.这里用按要素裁剪栅格的Python来 ...
- 用 Python 脚本实现对 Linux 服务器的监控
目前 Linux 下有一些使用 Python 语言编写的 Linux 系统监控工具 比如 inotify-sync(文件系统安全监控软件).glances(资源监控工具)在实际工作中,Linux 系统 ...
随机推荐
- [OOD]违反里氏替换原则的解决方案
关于OOD中的里氏替换原则,大家耳熟能祥了,不再展开,可以参考设计模式的六大设计原则之里氏替换原则.这里尝试讨论常常违反的两种形式和解决方案. 违反里氏替换原则的根源是对子类及父类关系不明确.我们在设 ...
- Linux磁盘管理命令
1.磁盘分割: fdisk [root@linux ~]# fdisk [-l] 装置名称 参数: -l :输出后面接的装置所有的partition内容.若仅有fdisk -l时, 则系统将会把整个系 ...
- 从一点儿不会开始——Unity3D游戏开发学习(一)
一些废话 我是一个windows phone.windows 8的忠实粉丝,也是一个开发者,开发数个windows phone应用和两个windows 8应用.对开发游戏一直抱有强烈兴趣和愿望,但奈何 ...
- Orcle数据库查询练习复习:四
一.题目 1.找出张三的最高分和最低分以及对应的课程名 select * from course c,mark m where c.cid=m.cid and sid =(select sid fro ...
- Segmentation Fault错误原因总结
最近在项目上遇到了Segmentation Fault的错误,一直调试不出来是哪里出了问题,对于刚接触嵌入式的,也不知道该如何去调试一个项目,定位内存问题,纠结了好几天,好阿红整理下自己的思路.从头开 ...
- linux/unix网络编程之 poll
转自http://www.cnblogs.com/zhuwbox/p/4222382.html poll 与 select 很类似,都是对描述符进行遍历,查看是否有描述符就绪.如果有就返回就绪文件描述 ...
- LA 4127 - The Sky is the Limit (离散化 扫描线 几何模板)
题目链接 非原创 原创地址:http://blog.csdn.net/jingqi814/article/details/26117241 题意:输入n座山的信息(山的横坐标,高度,山底宽度),计算他 ...
- Dialog第三方登录等待
1. styles.xml 中加入 <style name="loadingDialogStyle" parent="android:Theme.Dialog&qu ...
- OK335xS psplash make-image-header.sh hacking
/***************************************************************************** * OK335xS psplash mak ...
- apache开源项目 -- tomee
Apache TomEE,发音是“Tommy”,是一个经Apache.JavaEE6.Web框架认证的适配器,其在Tomcat服务器中是最强大的.Apache TomEE是由香草项目(简化常见编程任务 ...