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 解析XML文件
Apr 15 Python
python 合并文件的具体实例
Aug 08 Python
Django imgareaselect手动剪切头像实现方法
May 26 Python
python itchat实现微信好友头像拼接图的示例代码
Aug 14 Python
python获取多线程及子线程的返回值
Nov 15 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Python基础学习之基本数据结构详解【数字、字符串、列表、元组、集合、字典】
Jun 18 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
Mar 16 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
详解pyinstaller生成exe的闪退问题解决方案
Jun 19 Python
浅谈Python 参数与变量
Jun 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程序?
2006/12/08 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
phpmyadmin出现Cannot start session without errors问题解决方法
2014/08/14 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
PHP统一页面编码避免乱码问题
2015/04/09 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
php判断/计算闰年的方法小结【三种方法】
2019/07/06 PHP
laravel5环境隐藏index.php后缀(apache)的方法
2019/10/12 PHP
JScript的条件编译
2007/05/29 Javascript
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
Javascript 日期处理之时区问题
2009/10/08 Javascript
jQuery jqgrid 对含特殊字符json 数据的 Java 处理方法
2011/01/01 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
jquery实现倒计时代码分享
2014/06/13 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
vue2.0 axios前后端数据处理实例代码
2017/06/30 Javascript
浅谈JS中的常用选择器及属性、方法的调用
2017/07/28 Javascript
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
JS实现在线ps功能详解
2019/07/31 Javascript
python3编写C/S网络程序实例教程
2014/08/25 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
纯用NumPy实现神经网络的示例代码
2018/10/24 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Pandas的read_csv函数参数分析详解
2019/07/02 Python
python 非线性规划方式(scipy.optimize.minimize)
2020/02/11 Python
django admin 根据choice字段选择的不同来显示不同的页面方式
2020/05/13 Python
css3+jq创作含苞待放的荷花
2014/02/20 HTML / CSS
.net面试题
2015/12/22 面试题
一套C#面试题
2013/10/09 面试题
linux面试题参考答案(5)
2014/09/01 面试题
写给女朋友的道歉信
2014/01/08 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
为Centos安装指定版本的Docker
2022/04/01 Servers