这里我要找的是PHP的print_r函数。
这样我就可以通过查看有问题的对象的状态来调试脚本。
这里我要找的是PHP的print_r函数。
这样我就可以通过查看有问题的对象的状态来调试脚本。
当前回答
转储myObject:
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
我尝试了vars()和dir();都没有达到我的期望。Vars()不起作用,因为对象没有__dict__(异常。vars()参数必须具有__dict__属性)。dir()不是我要找的:它只是一个字段名称的列表,没有给出值或对象结构。
我认为json.dumps()将适用于大多数对象,没有default=json_util.default,但我在对象中有一个datetime字段,因此标准json序列化器失败。参见如何克服“约会时间”。datetime不是JSON序列化”在python?
其他回答
你需要vars()和pprint()的混合:
from pprint import pprint
pprint(vars(your_object))
要打印对象的当前状态,你可以:
>>> obj # in an interpreter
or
print repr(obj) # in a script
or
print obj
为你的类定义__str__或__repr__方法。来自Python文档:
__repr__(self)由repr()内置函数调用,由字符串调用 转换(反引号)到 计算“官方”字符串 对象的表示。如果有的话 可能,这看起来像a 有效的Python表达式 方法重新创建对象 相同的值(给定一个合适的 环境)。如果不可能, 形式为“<…一些有用的 描述……应该返回>。 返回值必须为字符串 对象。如果一个类定义了repr() 但不是__str__(),则__repr__()是 也用于“非正式”字符串 实例的表示 班级是必需的。这是典型的 用于调试,所以很重要 这个表示是 信息丰富且明确。 __str__(self)由str()内置函数调用,由print函数调用 语句来计算“非正式的” 对象的字符串表示形式。 这与__repr__()不同 它不必是一个有效的Python 表达:比较方便还是 可以使用简洁的表示 代替。返回值必须为a 字符串对象。
也许值得一查——
Python中是否存在与Perl的Data:: dump相同的程序?
我的建议是——
https://gist.github.com/1071857
注意,perl有一个名为Data::Dumper的模块,它将对象数据转换回perl源代码(注意:它不将代码转换回源代码,而且几乎总是你不想在输出中使用对象方法函数)。这可以用于持久性,但常见的目的是用于调试。
标准的python pprint有很多事情无法实现,特别是当它看到一个对象的实例时,它只是停止下降,并给你对象的内部十六进制指针(errr,顺便说一下,这个指针并没有很多用处)。所以简而言之,python就是这个伟大的面向对象范式,但是你从盒子里拿出来的工具是为处理对象以外的东西而设计的。
perl Data::Dumper允许你控制你想要去的深度,还可以检测循环链接结构(这真的很重要)。这个过程在perl中更容易实现,因为对象除了它们的祝福之外没有任何特殊的魔力(一个普遍定义良好的过程)。
from pprint import pprint
def print_r(the_object):
print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
pprint(vars(the_object))
试试beeprint吧。
它不仅可以帮助你打印对象变量,还可以帮助你输出漂亮的结果,就像这样:
class(NormalClassNewStyle):
dicts: {
},
lists: [],
static_props: 1,
tupl: (1, 2)