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在windows和linux下获得本机本地ip地址方法小结
Mar 20 Python
pyenv命令管理多个Python版本
Mar 26 Python
Python Paramiko模块的使用实际案例
Feb 01 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
对python 命令的-u参数详解
Dec 03 Python
python顺序执行多个py文件的方法
Jun 29 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
Python实现链表反转的方法分析【迭代法与递归法】
Feb 22 Python
基于pytorch中的Sequential用法说明
Jun 24 Python
Python中Selenium库使用教程详解
Jul 23 Python
python多线程和多进程关系详解
Dec 14 Python
Python中的matplotlib绘制百分比堆叠柱状图,并为每一个类别设置不同的填充图案
Apr 20 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 filter_var() 函数 Filter 函数
2012/04/25 PHP
利用PHP+JS实现搜索自动提示(实例)
2013/06/09 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
2016/11/04 PHP
PHP abstract 抽象类定义与用法示例
2018/05/29 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
js option删除代码集合
2008/11/12 Javascript
解决jQuery插件tipswindown与hintbox冲突
2010/11/05 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
鼠标左键单击冲突的问题解决方法(防止冒泡)
2014/05/14 Javascript
JavaScript的函数式编程基础指南
2016/03/19 Javascript
webpack中引用jquery的简单实现
2016/06/08 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
javascript十六进制数字和ASCII字符之间的转换方法
2016/12/27 Javascript
Vue + Webpack + Vue-loader学习教程之功能介绍篇
2017/03/14 Javascript
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
web.py获取上传文件名的正确方法
2014/08/26 Python
python中 logging的使用详解
2017/10/25 Python
Python数据分析库pandas基本操作方法
2018/04/08 Python
Django添加sitemap的方法示例
2018/08/06 Python
python学生信息管理系统(完整版)
2020/04/05 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
PyQt5 实现给窗口设置背景图片的方法
2019/06/13 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
墨西哥网上超市:Superama
2018/07/10 全球购物
常用UNIX 命令(Linux的常用命令)
2013/07/10 面试题
信访工作者先进事迹
2014/01/17 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
小学运动会班级口号
2014/06/09 职场文书
会计求职简历自我评价
2015/03/10 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
暖春观后感
2015/06/08 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏
Redis特殊数据类型bitmap位图
2022/06/01 Redis