我需要将许多对象打印到终端(用于调试)。普通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,如果重要的话。
答案 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])
在写入输出流之前, print
与str
做同样的事情。所以你要做的就是尽早进行渲染,然后再将其打印出来,然后切掉一块最大尺寸为你想要的东西。
Python切片是优雅的,因此像'xyz'[:30000]
这样的字符串切片只评估'xyz'
,而不是引发错误。