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中处理字符串之ljust()方法的使用简介
May 19 Python
Python中的一些陷阱与技巧小结
Jul 10 Python
Python执行时间的计算方法小结
Mar 17 Python
python利用OpenCV2实现人脸检测
Apr 16 Python
python抽取指定url页面的title方法
May 11 Python
numpy给array增加维度np.newaxis的实例
Nov 01 Python
python requests post多层字典的方法
Dec 27 Python
python3使用print打印带颜色的字符串代码实例
Aug 22 Python
pandas之分组groupby()的使用整理与总结
Jun 18 Python
tensorflow之读取jpg图像长和宽实例
Jun 18 Python
python的launcher用法知识点总结
Aug 07 Python
字典算法实现及操作 --python(实用)
Mar 31 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
php分页函数示例代码分享
2014/02/24 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
php递归函数怎么用才有效
2018/02/24 PHP
jQuery.ajax 用户登录验证代码
2010/10/29 Javascript
jQuery控制TR显示隐藏的三种常用方法
2014/08/21 Javascript
js对象继承之原型链继承实例
2015/01/10 Javascript
JSONP之我见
2015/03/24 Javascript
简介JavaScript中getUTCMonth()方法的使用
2015/06/10 Javascript
jQuery实现点击后标记当前菜单位置(背景高亮菜单)效果
2015/08/22 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
JavaScript模板引擎Template.js使用详解
2016/12/15 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
jquery如何实现点击空白处隐藏元素
2017/12/05 jQuery
nodejs实现超简单生成二维码的方法
2018/03/17 NodeJs
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
使用python检测手机QQ在线状态的脚本代码
2013/02/10 Python
python清除字符串里非数字字符的方法
2015/07/02 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
详解python中asyncio模块
2018/03/03 Python
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python数据集切分实例
2018/12/08 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
浅谈Python type的使用
2019/11/19 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
什么是测试驱动开发(TDD)
2012/02/15 面试题
设计师求职信
2014/07/01 职场文书
人事专员岗位职责说明书
2014/07/30 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
css3 filter属性的使用简介
2021/03/31 HTML / CSS
JavaWeb 入门篇:创建Web项目,Idea配置tomcat
2021/07/16 Java/Android