python中实现php的var_dump函数功能


Posted in Python onJanuary 21, 2015

最近在做python的web开发(原谅我的多变,好东西总想都学着。。。node.js也是),不过过程中总遇到些问题,不管是web.py还是django,开发起来确实没用php方便,毕竟存在的时间比较短,很多不完善的地方。

比如我在调试php中最常用的函数,var_dump,在python里找不到合适的替代函数。php中var_dump是一个特别有用的函数,它可以输出任何变量的值,不管你是一个对象还是一个数组,或者只是一个数。它总能用友好的方式输出,我调试的时候经常会需要看某位置的变量信息,调用它就很方便:

python中实现php的var_dump函数功能

但是开发python的时候就没有太好的替代方案。

之前想到repr,但这个函数只是调用了对象中的__str__,和直接print obj没啥区别。print是打印它,而repr是将其作为值返回。如果对象所属的类没有定义__str__这个函数,那么返回的就会是难看的一串字符。

后来又想到了vars 函数,vars函数是python的内建函数,专门用来输出一个对象的内部信息。但这个对象所属的类中必须有__dict__函数。一般的类都有这个dict,但像[]和{}等对象就不存在这个dict,这样调用vars函数就会抛出一个异常:

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

TypeError: vars() argument must have __dict__ attribute

所以后来几经寻找,找到一个个比较好,功能能够与var_dump类似的函数如下:

def dump(obj):

  '''return a printable representation of an object for debugging'''

  newobj=obj

  if '__dict__' in dir(obj):

    newobj=obj.__dict__

    if ' object at ' in str(obj) and not newobj.has_key('__type__'):

      newobj['__type__']=str(obj)

    for attr in newobj:

      newobj[attr]=dump(newobj[attr])

  return newobj

这是使用方式:

 class stdClass(object): pass

obj=stdClass()

obj.int=1

obj.tup=(1,2,3,4)

obj.dict={'a':1,'b':2, 'c':3, 'more':{'z':26,'y':25}}

obj.list=[1,2,3,'a','b','c',[1,2,3,4]]

obj.subObj=stdClass()

obj.subObj.value='foobar'
from pprint import pprint

pprint(dump(obj))

最后输出是:

{'__type__': '<__main__.stdClass object at 0x2b126000b890>',

 'dict': {'a': 1, 'c': 3, 'b': 2, 'more': {'y': 25, 'z': 26}},

 'int': 1,

 'list': [1, 2, 3, 'a', 'b', 'c', [1, 2, 3, 4]],

 'subObj': {'__type__': '<__main__.stdClass object at 0x2b126000b8d0>',

            'value': 'foobar'},

 'tup': (1, 2, 3, 4)}   

然后github有个开源的module,可以参考:https://github.com/sha256/python-var-dump

说一下pprint这个函数,他是一个人性化输出的函数,会将要输出的内容用程序员喜欢的方式输出在屏幕上。参阅这篇文章比较好理解:https://3water.com/article/60143.htm

Python 相关文章推荐
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
使用python装饰器验证配置文件示例
Feb 24 Python
Python通过PIL获取图片主要颜色并和颜色库进行对比的方法
Mar 19 Python
用Python遍历C盘dll文件的方法
May 06 Python
对python append 与浅拷贝的实例讲解
May 04 Python
TensorFlow数据输入的方法示例
Jun 19 Python
Python编程图形库之Pillow使用方法讲解
Dec 28 Python
python 输出所有大小写字母的方法
Jan 02 Python
Python如何调用JS文件中的函数
Aug 16 Python
用python实现英文字母和相应序数转换的方法
Sep 18 Python
python实现批量修改文件名
Mar 23 Python
如何利用python进行时间序列分析
Aug 04 Python
Python实现获取网站PR及百度权重
Jan 21 #Python
Python实现抓取页面上链接的简单爬虫分享
Jan 21 #Python
Python中多线程及程序锁浅析
Jan 21 #Python
Python实现的多线程端口扫描工具分享
Jan 21 #Python
Python中的pprint折腾记
Jan 21 #Python
通过C++学习Python
Jan 20 #Python
python入门之语句(if语句、while语句、for语句)
Jan 19 #Python
You might like
咖啡豆分级制度 咖啡豆等级分类 咖啡豆是按口感分类的吗?
2021/03/05 新手入门
thinkPHP5项目中实现QQ第三方登录功能
2017/10/20 PHP
win10 apache配置虚拟主机后localhost无法使用的解决方法
2018/01/27 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
使用impress.js制作幻灯片
2015/09/09 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
js实现百度登录框鼠标拖拽效果
2017/03/07 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
关于foreach循环中遇到的问题小结
2017/05/08 Javascript
vue2.0页面前进刷新回退不刷新的实现方法
2018/07/31 Javascript
使用webpack搭建vue项目及注意事项
2019/06/10 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
python安装PIL模块时Unable to find vcvarsall.bat错误的解决方法
2016/09/19 Python
python实现聊天小程序
2018/03/13 Python
Python格式化输出%s和%d
2018/05/07 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
Python函数的参数常见分类与用法实例详解
2019/03/30 Python
python基于paramiko将文件上传到服务器代码实现
2019/07/08 Python
python按比例随机切分数据的实现
2019/07/11 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
西班牙土拨鼠床垫公司,感觉在云端:Marmota
2019/03/18 全球购物
借款协议书
2014/09/16 职场文书
认错检讨书
2014/10/02 职场文书
2015年端午节活动策划书
2015/05/05 职场文书
2015年党建工作目标责任书
2015/05/08 职场文书
怎样写家长意见
2015/06/04 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
百年校庆宣传标语口号
2015/12/26 职场文书
css布局巧妙技巧之css三角示例的运用
2022/03/16 HTML / CSS
关于的python五子棋的算法
2022/05/02 Python