我有许多对象需要打印到终端(用于调试).普通print函数几乎是完美的,除了一些对象太大,因此print会产生数百万行输出.我想创建一个执行功能的函数print,除了在预定义数量的字符之后截断输出,用其替换其余字符....
有什么好办法呢?
请注意,性能是一个问题,所以理想情况下我不想保存一个千兆字节大小的字符串,然后从中获取前几个字符; 类似地,pprint有点问题,因为它在字典中对键进行排序(并且需要数百万个键才需要一段时间).
例:
obj = [ [1, 2, 3], list(range(1000000)) ]
my_print(obj, 20)
# should output:
# [[1, 2, 3], [0, 1, 2...
Run Code Online (Sandbox Code Playgroud)
Python 3,如果重要的话.
Luk*_*raf 10
reprlib@ m0nhawk建议的模块(仅限Python 3.x)就是为了这个目的.以下是您将如何使用它:
如果你没有使用默认限制,你可以简单地使用reprlib.repr(obj):
import reprlib
obj = [[1, 2, 3], list(range(10000))]
print(reprlib.repr(obj))
Run Code Online (Sandbox Code Playgroud)
输出:
[[1, 2, 3], [0, 1, 2, 3, 4, 5, ...]]
Run Code Online (Sandbox Code Playgroud)
要自定义可用限制,只需创建一个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))
Run Code Online (Sandbox Code Playgroud)
输出:
[[1, 2, 3], [0, 1, 2, 3, ...], 'lo...ing', 'a', ...]
Run Code Online (Sandbox Code Playgroud)
如果您正在处理引用自身的序列对象,则可以使用Repr.maxlevel限制递归深度:
lst = [1, 2, 3]
lst.append(lst) # oh my!
r = reprlib.Repr()
r.maxlevel = 5 # max recursion depth
print(r.repr(lst))
Run Code Online (Sandbox Code Playgroud)
输出:
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...]]]]]]
Run Code Online (Sandbox Code Playgroud)
请注意,reprlib.repr() 返回一个字符串,但不是print它(除非您在交互式控制台中,您输入的每个表达式的结果都会被评估并显示其表示).
| 归档时间: |
|
| 查看次数: |
11237 次 |
| 最近记录: |