joz*_*yqk 3 python debugging recursion var-dump
str()并且repr()可以用来打印一个变量的内容在python.但变量的内容可能非常复杂.该pprint库,作为PHPvar_dump()等价物报告,非常适合以易于阅读的格式显示数据:什么是Python的var_dump()的Python等价物?,Python中是否有一个函数来打印对象的所有当前属性和值?
但是,如果有数据对象([编辑]尚未实施__str__或__repr__)str(),repr()而pprint只是给了他们的名字.我想要一个可以递归遍历对象属性的方法,正确地给出变量的整个表示.
某些功能(例如内置版)不应打印,因为它没用.该方法还应该能够处理诸如getattr抛出异常之类的问题.也许自定义迭代也可以像列表一样处理.
我在下面给了它一个镜头.并不是说它不起作用,但我确信没有考虑边缘情况,可能还有一些输出缺失的信息(例如区分元组/列表).我的意思是说,请分享替代方案:)
这是我的答案。就我的目的而言,这非常有效,但是我敢肯定,还有更强大的方法可以做到这一点。如果您有更好的方法,请分享:)
import types
def var_dump(obj, depth=4, l=""):
#fall back to repr
if depth<0: return repr(obj)
#expand/recurse dict
if isinstance(obj, dict):
name = ""
objdict = obj
else:
#if basic type, or list thereof, just print
canprint=lambda o:isinstance(o, (int, float, str, unicode, bool, types.NoneType, types.LambdaType))
try:
if canprint(obj) or sum(not canprint(o) for o in obj) == 0: return repr(obj)
except TypeError, e:
pass
#try to iterate as if obj were a list
try:
return "[\n" + "\n".join(l + var_dump(k, depth=depth-1, l=l+" ") + "," for k in obj) + "\n" + l + "]"
except TypeError, e:
#else, expand/recurse object attribs
name = (hasattr(obj, '__class__') and obj.__class__.__name__ or type(obj).__name__)
objdict = {}
for a in dir(obj):
if a[:2] != "__" and (not hasattr(obj, a) or not hasattr(getattr(obj, a), '__call__')):
try: objdict[a] = getattr(obj, a)
except Exception, e: objdict[a] = str(e)
return name + "{\n" + "\n".join(l + repr(k) + ": " + var_dump(v, depth=depth-1, l=l+" ") + "," for k, v in objdict.iteritems()) + "\n" + l + "}"
Run Code Online (Sandbox Code Playgroud)
输出示例:
class B(object):
mystatic = [1,2,3]
class A:
mystatic = "hello"
def __init__(self):
self.mymember1 = B()
self.mymember2 = B(), 123.4, "world"
def myfunc(self):
print "hi"
var = {"foo": A(), "bar": B()}
...
>>> print var_dump(var)
{
'foo': A{
'mystatic': 'hello',
'mymember1': B{
'mystatic': [1, 2, 3],
},
'mymember2': [
B{
'mystatic': [1, 2, 3],
},
123.4,
'world',
],
},
'bar': B{
'mystatic': [1, 2, 3],
},
}
Run Code Online (Sandbox Code Playgroud)
我之所以写这篇文章,是因为使用了django的调试工具栏,pprint并且只显示了一级数据。
这将以json或yaml(采取您的选择)缩进格式递归打印出所有对象内容:
import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml
serialized = jsonpickle.encode(obj)
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |