限制打印输出

时间:2015-03-28 20:04:37

标签: python python-3.x

我需要将许多对象打印到终端(用于调试)。普通print函数几乎是完美的,除了一些对象太大,因此print将创建数百万行输出。我想创建一个执行print所做功能的函数,除了在预定义数量的字符后截断输出,用...替换其余字符。

这样做的好方法是什么?

请注意,性能是一个问题,所以理想情况下,我不想保存一个千兆字节大小的字符串,然后从中获取前几个字符;类似地,pprint有点问题,因为它在字典中对键进行排序(并且需要数百万个键才需要一段时间)。

示例:

obj = [ [1, 2, 3], list(range(1000000)) ]
my_print(obj, 20)
# should output:
# [[1, 2, 3], [0, 1, 2...

Python 3,如果重要的话。

2 个答案:

答案 0 :(得分:9)

@ m0nhawk建议的reprlib模块(仅限Python 3.x)完全是出于此目的。以下是您将如何使用它:

如果你对默认限制没问题,你只需使用reprlib.repr(obj)

import reprlib

obj = [[1, 2, 3], list(range(10000))]

print(reprlib.repr(obj))

输出:

[[1, 2, 3], [0, 1, 2, 3, 4, 5, ...]]

自定义available limits ,只需创建一个reprlib.Repr实例并设置相应的实例属性:

r = reprlib.Repr()
r.maxlist = 4       # max elements displayed for lists
r.maxstring = 10    # max characters displayed for strings

obj = [[1, 2, 3], list(range(10000)), 'looooooong string', 'a', 'b', 'c']

print(r.repr(obj))

输出:

[[1, 2, 3], [0, 1, 2, 3, ...], 'lo...ing', 'a', ...]

如果您正在处理序列引用自己的对象,则可以使用Repr.maxlevel来限制递归深度:

lst = [1, 2, 3]
lst.append(lst)  # oh my!

r = reprlib.Repr()
r.maxlevel = 5   # max recursion depth

print(r.repr(lst))

输出:

[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...]]]]]]

请注意reprlib.repr() 返回字符串,但不print它(除非您在交互式控制台中,您输入的每个表达式的结果都会被评估并显示其表示)。

答案 1 :(得分:3)

为什么不在print函数上创建一个简单的切片包装器?

def my_print(obj, depth):
    print(str(obj)[:depth])
在写入输出流之前,

printstr做同样的事情。所以你要做的就是尽早进行渲染,然后再将其打印出来,然后切掉一块最大尺寸为你想要的东西。

Python切片是优雅的,因此像'xyz'[:30000]这样的字符串切片只评估'xyz',而不是引发错误。