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实现通过哈希算法检测图片重复的教程
Apr 02 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
Aug 07 Python
基于Python的文件类型和字符串详解
Dec 21 Python
搞定这套Python爬虫面试题(面试会so easy)
Apr 03 Python
使用Python实现企业微信的自动打卡功能
Apr 30 Python
对Django中的权限和分组管理实例讲解
Aug 16 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
在Python中实现函数重载的示例代码
Dec 12 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
Jan 14 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
Python常用数字处理基本操作汇总
Sep 10 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 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用header函数实现301跳转代码实例
2013/11/25 PHP
php如何控制用户对图片的访问 PHP禁止图片盗链
2016/03/25 PHP
PHP仿微信发红包领红包效果
2016/10/30 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
传智播客学习之java 反射
2009/11/22 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
jQuery代码优化 遍历篇
2011/11/01 Javascript
jquery选择器的选择使用及性能介绍
2013/01/16 Javascript
JavaScript希尔排序、快速排序、归并排序算法
2016/05/08 Javascript
jQuery中delegate()方法的用法详解
2016/10/13 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
js时间戳和c#时间戳互转方法(推荐)
2017/02/15 Javascript
Node.JS使用Sequelize操作MySQL的示例代码
2017/10/09 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
jQuery鼠标滑过横向时间轴样式(代码详解)
2019/11/01 jQuery
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[47:50]Secret vs VP 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[01:14]英雄,所敬略同——2018完美盛典宣传视频
2018/12/05 DOTA
详解Django框架中用户的登录和退出的实现
2015/07/23 Python
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
python检索特定内容的文本文件实例
2018/06/05 Python
基于随机梯度下降的矩阵分解推荐算法(python)
2018/08/31 Python
PyCharm取消波浪线、下划线和中划线的实现
2020/03/03 Python
python实现对变位词的判断方法
2020/04/05 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
原生 JS+CSS+HTML 实现时序图的方法
2019/07/31 HTML / CSS
俄罗斯和世界各地的酒店预订:Hotels.com俄罗斯
2016/08/19 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
会计助理的岗位职责
2013/11/29 职场文书
高职教师岗位职责
2013/12/24 职场文书
酒店拾金不昧表扬信
2014/01/18 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
2015年秋季小学开学标语
2015/07/16 职场文书
总结Java对象被序列化的两种方法
2021/06/30 Java/Android