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 相关文章推荐
通过数据库向Django模型添加字段的示例
Jul 21 Python
使用Python对MySQL数据操作
Apr 06 Python
Python使用random.shuffle()打乱列表顺序的方法
Nov 08 Python
python super的使用方法及实例详解
Sep 25 Python
Django框架ORM数据库操作实例详解
Nov 07 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
python实现快递价格查询系统
Mar 03 Python
Python参数传递对象的引用原理解析
May 22 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
Python  word实现读取及导出代码解析
Jul 09 Python
Python 串口通信的实现
Sep 29 Python
Python爬虫开发与项目实战
Dec 16 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获取服务器操作系统相关信息的方法
2016/10/08 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
laravel使用Faker数据填充的实现方法
2019/04/12 PHP
jQuery 插件 将this下的div轮番显示
2009/04/09 Javascript
表单切换,用回车键替换Tab健(不支持IE)
2011/07/20 Javascript
js格式化时间的方法
2015/12/18 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
js检测离开或刷新页面时表单数据是否更改的方法
2016/08/02 Javascript
JS实现根据密码长度显示安全条功能
2017/03/08 Javascript
js原生Ajax的封装和原理详解
2017/03/11 Javascript
js中null与空字符串&quot;&quot;的区别讲解
2019/01/17 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
使用python装饰器验证配置文件示例
2014/02/24 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
python绘制简单彩虹图
2018/11/19 Python
Django+Xadmin构建项目的方法步骤
2019/03/06 Python
Python3.4解释器用法简单示例
2019/03/22 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
python利用google翻译方法实例(翻译字幕文件)
2020/09/21 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
美国男士内衣品牌:Tommy John
2017/12/22 全球购物
应届生人事助理求职信
2013/11/09 职场文书
英语专业学生个人求职信
2014/01/28 职场文书
五四青年节演讲稿
2014/05/26 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
2014党委书记四风对照检查材料思想汇报
2014/09/21 职场文书
县委务虚会发言材料
2014/10/20 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
2015年乡镇卫生院妇幼保健工作总结
2015/05/19 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
2016入党积极分子党校培训心得体会
2016/01/06 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
ORACLE查看当前账号的相关信息
2021/06/18 Oracle
SQL Server2019数据库备份与还原脚本,数据库可批量备份
2021/11/20 SQL Server
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang