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实现360皮肤按钮控件示例
Feb 21 Python
python利用装饰器进行运算的实例分析
Aug 04 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
Python实现拷贝/删除文件夹的方法详解
Aug 29 Python
python覆盖写入,追加写入的实例
Jun 26 Python
Python图片的横坐标汉字实例
Dec 04 Python
Python 模拟生成动态产生验证码图片的方法
Feb 01 Python
Python如何使用turtle库绘制图形
Feb 26 Python
django xadmin action兼容自定义model权限教程
Mar 30 Python
解决python执行较大excel文件openpyxl慢问题
May 15 Python
python之openpyxl模块的安装和基本用法(excel管理)
Feb 03 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 GeoIP的使用教程
2011/03/09 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
如何判断php数组的维度
2013/06/10 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
laravel 关联关系遍历数组的例子
2019/10/10 PHP
你所要知道JS(DHTML)中的一些技巧
2007/01/09 Javascript
JavaScript之Getters和Setters 平台支持等详细介绍
2012/12/07 Javascript
jQuery 遍历- 关于closest() 的方法介绍以及与parents()的方法区别分析
2013/04/26 Javascript
jquery插件jquery倒计时插件分享
2013/12/27 Javascript
jQuery 无限级菜单的简单实例
2014/02/21 Javascript
Express.JS使用详解
2014/07/17 Javascript
JS右下角广告窗口代码(可收缩、展开及关闭)
2015/09/04 Javascript
js读取并解析JSON类型数据的方法
2015/11/14 Javascript
Vue组件选项props实例详解
2017/08/18 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
微信小程序自定义顶部组件customHeader的示例代码
2020/06/03 Javascript
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
Python lambda和Python def区别分析
2014/11/30 Python
python判断输入日期为第几天的实例
2018/11/13 Python
python爬虫之urllib库常用方法用法总结大全
2018/11/14 Python
Python玩转Excel的读写改实例
2019/02/22 Python
基于python实现检索标记敏感词并输出
2020/05/07 Python
Python实现手绘图效果实例分享
2020/07/22 Python
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
abstract class和interface有什么区别
2013/08/04 面试题
入党自我评价优缺点
2014/01/25 职场文书
社区娱乐活动方案
2014/08/21 职场文书
家庭贫困证明
2014/09/23 职场文书
2014年接待工作总结
2014/11/26 职场文书
长城导游词300字
2015/01/30 职场文书
图书借阅制度范本
2015/08/06 职场文书
Pytest allure 命令行参数的使用
2021/04/18 Python
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
mysql数据插入覆盖和时间戳的问题及解决
2022/03/25 MySQL
【DOTA2】高能暴走TK秀!PSG LGD vs ASTER - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA