Python的print语句通常适用于任意数据结构(特别是由argparse.Namespace创建的数据结构),这很有用。其中一个不起作用的情况是你处理包含循环的复杂对象图(一个对象指向另一个对象,指向原始对象);在尝试将对象转换为字符串时,这会导致无限递归。
有没有办法创建一个适合打印以进行调试的字符串表示,检查周期,因此可以处理任意对象图? (Python 2.7如果重要的话。)
答案 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)