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中用memcached来减少数据库查询次数的教程
Apr 07 Python
Python multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
python3实现读取chrome浏览器cookie
Jun 19 Python
详解Python中的相对导入和绝对导入
Jan 06 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
Apr 11 Python
Python获取本机所有网卡ip,掩码和广播地址实例代码
Jan 22 Python
logging level级别介绍
Feb 21 Python
python生成任意频率正弦波方式
Feb 25 Python
Python AutoCAD 系统设置的实现方法
Apr 01 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
20行代码教你用python给证件照换底色的方法示例
Feb 05 Python
Python爬虫框架之Scrapy中Spider的用法
Jun 28 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
destoon调用自定义模板及样式的公告栏
2014/06/21 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
2018/05/12 PHP
javascript 用原型继承来实现对象系统
2010/03/22 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
用html+css+js实现的一个简单的图片切换特效
2014/05/28 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
基于JSON数据格式详解
2017/08/31 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
基于js实现判断浏览器类型代码实例
2020/07/17 Javascript
uin-app+mockjs实现本地数据模拟
2020/08/26 Javascript
浅析我对JS延迟异步脚本的思考
2020/10/12 Javascript
[50:58]2018DOTA2亚洲邀请赛3月29日 小组赛A组OpTic VS Newbee
2018/03/30 DOTA
python列表操作之extend和append的区别实例分析
2015/07/28 Python
使用Python对Excel进行读写操作
2017/03/30 Python
python+os根据文件名自动生成文本
2019/03/21 Python
Python实现时间序列可视化的方法
2019/08/06 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
2019/08/23 Python
Django admin管理工具TabularInline类用法详解
2020/05/14 Python
python学习笔记之多进程
2020/08/06 Python
Python SMTP发送电子邮件的示例
2020/09/23 Python
python中实现词云图的示例
2020/12/19 Python
HTML5 Canvas 绘图——使用 Canvas 绘制图形图文教程 使用html5 canvas 绘制精美的图
2015/08/31 HTML / CSS
总经理办公室主任岗位职责
2013/11/12 职场文书
2014乡镇“三八”国际劳动妇女节活动总结
2014/03/01 职场文书
yy婚礼主持词
2014/03/14 职场文书
酒店辞职书怎么写
2015/02/26 职场文书
交通安全月活动总结
2015/05/08 职场文书
Redis5之后版本的高可用集群搭建的实现
2021/04/27 Redis
MySQL 覆盖索引的优点
2021/05/19 MySQL
使用nginx配置访问wgcloud的方法
2021/06/26 Servers