打印循环数据结构

时间:2014-03-29 20:34:25

标签: python debugging python-2.7

Python的print语句通常适用于任意数据结构(特别是由argparse.Namespace创建的数据结构),这很有用。其中一个不起作用的情况是你处理包含循环的复杂对象图(一个对象指向另一个对象,指向原始对象);在尝试将对象转换为字符串时,这会导致无限递归。

有没有办法创建一个适合打印以进行调试的字符串表示,检查周期,因此可以处理任意对象图? (Python 2.7如果重要的话。)

1 个答案:

答案 0 :(得分:0)

好的,我编写了自己的函数来打印可能直接或间接引用循环数据结构的argparse.Namespace对象:

def pr(a):
    print 'Namespace'
    seen = set()
    def f(a, indent):
        for k, v in sorted(a.__dict__.items()):
            s = indent * ' '
            if type(v) == argparse.Namespace:
                if id(v) in seen:
                    print '%s%s: Namespace' % (s, k)
                else:
                    seen.add(id(v))
                    print '%s%s:' % (s, k)
                    f(v, indent + 1)
            elif type(v) == bytearray:
                print '%s%s: bytearray(%s)' % (s, k, len(v))
            elif type(v) == list:
                print '%s%s: [%s]' % (s, k, len(v))
            elif type(v) == str:
                print '%s%s: %s' % (s, k, repr(v))
            elif type(v) == tuple:
                print '%s%s: (%s)' % (s, k, len(v))
            elif type(v) in (int, long):
                print '%s%s: %x' % (s, k, v)
            else:
                print '%s%s: %s' % (s, k, v)
    f(a, 1)