如何递归打印变量的内容,包括数据和对象属性?

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抛出异常之类的问题.也许自定义迭代也可以像列表一样处理.


我在下面给了它一个镜头.并不是说它不起作用,但我确信没有考虑边缘情况,可能还有一些输出缺失的信息(例如区分元组/列表).我的意思是说,请分享替代方案:)

joz*_*yqk 5

这是我的答案。就我的目的而言,这非常有效,但是我敢肯定,还有更强大的方法可以做到这一点。如果您有更好的方法,请分享:)

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并且只显示了一级数据。


wis*_*cky 5

这将以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)