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的Django框架中为代码添加注释的方法
Jul 16 Python
浅谈scrapy 的基本命令介绍
Jun 13 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
Python中文件的读取和写入操作
Apr 27 Python
python爬取网页转换为PDF文件
Jun 07 Python
python绘制直线的方法
Jun 30 Python
python无限生成不重复(字母,数字,字符)组合的方法
Dec 04 Python
python检测IP地址变化并触发事件
Dec 26 Python
解决Python 使用h5py加载文件,看不到keys()的问题
Feb 08 Python
简单了解Django ContentType内置组件
Jul 23 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
使用python执行shell脚本 并动态传参 及subprocess的使用详解
Mar 06 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
通过文字传递创建的图形按钮
2006/10/09 PHP
php 计划任务 检测用户连接状态
2012/03/29 PHP
php 地区分类排序算法
2013/07/01 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
php与阿里云短信接口接入操作案例分析
2020/05/27 PHP
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
JavaScript 一道字符串分解的题目
2011/08/03 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
Javascript闭包与函数柯里化浅析
2016/06/22 Javascript
JavaScript实现简单的拖动效果
2016/07/02 Javascript
AngularJs Understanding the Model Component
2016/09/02 Javascript
JavaScript仿微博输入框效果(案例分析)
2016/12/06 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
React Native仿美团下拉菜单的实例代码
2017/08/08 Javascript
Vue Element使用icon图标教程详解(第三方)
2018/02/07 Javascript
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python如何将多个PDF进行合并
2019/08/13 Python
djano一对一、多对多、分页实例代码
2019/08/16 Python
python 实现按对象传值
2019/12/26 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
python如何操作mysql
2020/08/17 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
信息专业个人的自我评价
2013/12/27 职场文书
职业规划书如何设计?
2014/01/09 职场文书
公司爱心捐款倡议书
2014/05/14 职场文书
护理专业自荐书
2014/06/04 职场文书
实验室标语
2014/06/21 职场文书
2015年超市收银员工作总结
2015/04/25 职场文书
三八节祝酒词
2015/08/11 职场文书
文明礼仪主题班会
2015/08/13 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript