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实现微信公众平台自定义菜单实例
Mar 20 Python
python打包压缩、读取指定目录下的指定类型文件
Apr 12 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 Python
python3 tcp的粘包现象和解决办法解析
Dec 09 Python
Python Tensor FLow简单使用方法实例详解
Jan 14 Python
对Python中 \r, \n, \r\n的彻底理解
Mar 06 Python
解决redis与Python交互取出来的是bytes类型的问题
Jul 16 Python
python使用布隆过滤器的实现示例
Aug 20 Python
python调用摄像头的示例代码
Sep 28 Python
Python 随机按键模拟2小时
Dec 30 Python
python爬虫请求库httpx和parsel解析库的使用测评
May 10 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
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
PHP数组 为文章加关键字连接 文章内容自动加链接
2011/12/29 PHP
ThinkPHP的RBAC(基于角色权限控制)深入解析
2013/06/17 PHP
php支付宝接口用法分析
2015/01/04 PHP
php获取、检查类名、函数名、方法名的函数方法
2015/06/25 PHP
php实现Mysql简易操作类
2015/10/11 PHP
浅析Yii2中GridView常见操作
2016/04/22 PHP
fromCharCode和charCodeAt 方法
2006/12/27 Javascript
js 解决“options为空或不是对象”
2008/12/22 Javascript
JS中Date日期函数中的参数使用介绍
2014/01/02 Javascript
javascript实现checkbox复选框实例代码
2016/01/10 Javascript
AngularJS入门教程之迭代器过滤详解
2016/08/18 Javascript
Bootstrap 3 按钮标签实例代码
2017/02/21 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
基于Bootstrap模态对话框只加载一次 remote 数据的解决方法
2017/07/09 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
vue中实现图片压缩 file文件的方法
2020/05/28 Javascript
[01:06] DOTA2英雄背景故事第三期之秩序法则光之守卫
2020/07/07 DOTA
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
Django集成搜索引擎Elasticserach的方法示例
2019/06/04 Python
python 公共方法汇总解析
2019/09/16 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
授权委托书范本
2014/04/03 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
学校募捐倡议书
2014/05/14 职场文书
励志演讲稿500字
2014/08/21 职场文书
法人代表身份证明书及授权委托书
2014/09/16 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2015年党性分析材料
2014/12/19 职场文书
整改通知书格式
2015/04/22 职场文书