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 smallseg分词用法实例分析
May 28 Python
python+Django+apache的配置方法详解
Jun 01 Python
python使用代理ip访问网站的实例
May 07 Python
Python实现自动访问网页的例子
Feb 21 Python
在Python 的线程中运行协程的方法
Feb 24 Python
python中shell执行知识点
May 06 Python
Python django框架 web端视频加密的实例详解
Nov 20 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 Python
Python 如何将integer转化为罗马数(3999以内)
Jun 05 Python
关于python pygame游戏进行声音添加的技巧
Oct 24 Python
彻底弄懂Python中的回调函数(callback)
Jun 25 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操作SVN版本服务器类代码
2011/11/27 PHP
php数据库配置文件一般做法分享
2012/07/07 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
Yii2简单实现给表单添加验证码的方法
2016/07/18 PHP
php中this关键字用法分析
2016/12/07 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
thinkphp5框架路由原理与用法详解
2020/02/11 PHP
一样的table?不一样的table(可编辑状态table)
2012/09/19 Javascript
初始Nodejs
2014/11/08 NodeJs
js中flexible.js实现淘宝弹性布局方案
2020/06/23 Javascript
AngularJS实现Input格式化的方法
2016/11/07 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
js实现登录框鼠标拖拽效果
2017/03/09 Javascript
详解nodejs微信公众号开发——6.自定义菜单
2017/04/13 NodeJs
node.js自动上传ftp的脚本分享
2018/06/16 Javascript
webpack@v4升级踩坑(小结)
2018/10/08 Javascript
微信小程序的授权实现过程解析
2019/08/02 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
vue实现图书管理系统
2020/12/29 Vue.js
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
python开发之函数定义实例分析
2015/11/12 Python
Python自动化运维_文件内容差异对比分析
2017/12/13 Python
python re模块findall()函数实例解析
2018/01/19 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
解决nohup执行python程序log文件写入不及时的问题
2019/01/14 Python
python 一个figure上显示多个图像的实例
2019/07/08 Python
python中如何使用虚拟环境
2020/10/14 Python
法国房车租赁网站:Yescapa
2019/08/26 全球购物
中年人生感言
2014/02/04 职场文书
网络信息安全承诺书
2014/03/26 职场文书
健康教育评估方案
2014/05/25 职场文书
学术诚信承诺书
2014/05/26 职场文书
党员志愿者服务倡议书
2015/04/29 职场文书
Python实现双向链表
2022/05/25 Python