版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址

  http://www.cnblogs.com/Colin-Cai/p/12741423.html 

  作者:窗户

  QQ/微信:6679072

  E-mail:6679072@qq.com

  有的时候,我们写Python程序需要处理复杂对象,过程中调试可能需要去看看产生的对象如何,我们可以把它打印成json来看,这是个不错的办法。

  对每一个对象写一个独立的打印成json的程序是个不能复用的工作,我们可以考虑通用的写法,好在Python的反射可以帮我们做到这一点,以下为我晚上所写,所有的成员名字按字典排布打印。

from functools import reduce
make_json = lambda blanks,obj : \
(lambda t, cut : \
'null' if obj==None \
else str(obj) if t in (int,float) \
else ('true' if obj else 'false') if t==bool \
else '"%s"'%obj if t==str \
else '[' + cut(reduce(lambda r,x:r+',\n'+' '*(blanks+2)+make_json(blanks+2,x), obj, '')) \
+ '\n' + ' '*blanks + ']' if t in (list, tuple) \
else '{' + cut(reduce(lambda r,x:r+',\n'+' '*(blanks+2)+'"%s" : '%x+make_json(blanks+2,obj[x]), \
sorted(filter(lambda x:type(x)==str,obj.keys())), '')) + '\n' + ' '*blanks + '}' if t==dict \
else reduce(lambda r,x:r+'%02x'%x, list(map(int, obj)),'"')+'"' if t==bytes \
else '{' + cut(reduce(lambda r,x:\
r+',\n'+' '*(blanks+2)+'"%s" : '%x+make_json(blanks+2,obj.__dict__[x]), \
sorted(filter(lambda x:len(x)<4 or x[:2]!='__' \
or x[-2:]!='__',obj.__dict__.keys())), '')) + '\n' + ' '*blanks + '}') \
(type(obj), lambda x:x if x=='' else x[1:]) print_json = lambda obj, fprint : fprint(make_json(0, obj))

  以上的print_json就是打印json的函数,fprint是一个接打印字符串的函数,这里你当然可以随便打印到哪里。

  我们测试如下:

class class1:
def __init__(self):
self.a1 = None
self.b1 = None
self.c1 = None class class2:
def __init__(self):
self.a2 = None
self.b2 = None
self.c2 = None class class3:
def __init__(self):
self.a3 = None
self.b3 = None
self.c3 = None test_obj = class1()
test_obj.a1 = [1, None, 2.5, class2(), True]
test_obj.a1[3].a2 = [class3(), class3()]
test_obj.a1[3].a2[0].a3 = [1, 2, 3]
test_obj.a1[3].a2[0].b3 = ["test1", "test2"]
test_obj.a1[3].a2[0].c3 = None
test_obj.a1[3].a2[1].a3 = [5, 6, 7]
test_obj.a1[3].a2[1].b3 = ["test3", "test4"]
test_obj.a1[3].a2[1].c3 = [True, False]
test_obj.a1[3].b2 = {"x":1, "y":2}
test_obj.a1[3].c2 = type('', (), {"x":10, "y":20})
test_obj.b1 = 100
test_obj.c1 = "test"
print_json(test_obj, print)

  以上构建了一个test_obj对象,并打印出来。

{
"a1": [
1,
null,
2.5,
{
"a2": [
{
"a3": [
1,
2,
3
],
"b3": [
"test1",
"test2"
],
"c3": null
},
{
"a3": [
5,
6,
7
],
"b3": [
"test3",
"test4"
],
"c3": [
true,
false
]
}
],
"b2": {
"x": 1,
"y": 2
},
"c2": {
"x": 10,
"y": 20
}
},
true
],
"b1": 100,
"c1": "test"
}

  这是一个标准的json,显然print_json函数是可用的。Python2里print是个命令,所以需要包装成一下。

  如果上述想打印到文件,你可以

json_file = open('test_obj.json', 'w')
print_json(test_obj, lambda s:print(s, file=json_file))
json_file.close()

  

  声明:以上代码作者是我本人(Colin Cai),可以随便使用,不受任何约束,如出现任何错误与损失均和笔者无任何关系!

最新文章

  1. CentOS7安装Oracle 11gR2 安装
  2. 用jQuery File Upload做的上传控件demo,支持同页面多个上传按钮
  3. 二、快速起步(Mysql镜像)
  4. 【wikioi】1012 最大公约数和最小公倍数问题
  5. Android 轻量级ORM数据库开源框架ActiveAndroid 源码分析
  6. 在linux下编译netcat并且反弹cmdshell(转载)
  7. Apache 80 端口被占用无法重启解决办法
  8. bootstrap前端开发框架,未来发展趋势
  9. linux下多进程的调试
  10. 客户端程序通过TCP通信传送&quot;小文件&quot;到服务器
  11. 图解虚数 - A Visual, Intuitive Gudie to Imaginary Numbers
  12. linux 分布式文件系统
  13. Python中模块之logging &amp; subprocess的讲解
  14. React 特性剪辑(版本 16.0 ~ 16.9)
  15. 软件调用QML的两种方式
  16. echo -n 和echo -e 参数意义
  17. docker教程——docker镜像打包上传
  18. Tomcat 异常关闭排查
  19. static变量和static函数
  20. 工具类之Mutex

热门文章

  1. ML-Agents(三)3DBall例子
  2. 使用 Vue.js 改写 React 的官方教程井字棋
  3. P5663 加工零件 题解
  4. In Triangle Test / To Left Test
  5. Python第六章-函数01-函数的概念和使用
  6. OpenCV-Python OpenCV中的K-Means聚类 | 五十八
  7. 8 个出没在 Linux 终端的诡异家伙
  8. windows10远程桌面,出现“出现身份验证错误 要求的函数不受支持...”等错误解决方法
  9. Python查看3Dnii文件
  10. [一起读源码]走进C#并发队列ConcurrentQueue的内部世界