Python 限制打印输出
我有许多对象需要打印到终端(用于调试)。正常的Python 限制打印输出,python,python-3.x,Python,Python 3.x,我有许多对象需要打印到终端(用于调试)。正常的print功能几乎完美,只是有些对象太大,因此print会产生数百万行输出。我想创建一个函数,它执行print的功能,只是输出在预定义的字符数之后被截断,其余的替换为… 做这件事的好方法是什么 请注意,性能是一个问题,因此理想情况下,我不希望保存一个GB大小的字符串,然后从中提取前几个字符;类似地,pprint也有点问题,因为它在字典中对键进行排序(使用数百万个键需要一段时间) 例如: obj = [ [1, 2, 3], list(range(10
print
功能几乎完美,只是有些对象太大,因此print
会产生数百万行输出。我想创建一个函数,它执行print
的功能,只是输出在预定义的字符数之后被截断,其余的替换为…
做这件事的好方法是什么
请注意,性能是一个问题,因此理想情况下,我不希望保存一个GB大小的字符串,然后从中提取前几个字符;类似地,pprint
也有点问题,因为它在字典中对键进行排序(使用数百万个键需要一段时间)
例如:
obj = [ [1, 2, 3], list(range(1000000)) ]
my_print(obj, 20)
# should output:
# [[1, 2, 3], [0, 1, 2...
Python3,如果有关系的话。为什么不在
print
函数上做一个简单的切片包装器呢
def my_print(obj, depth):
print(str(obj)[:depth])
print
在写入输出流之前执行与str
相同的操作。所以你要做的是,在把它印出来之前,尽早进行铸造,然后切掉一块最大尺寸为你想要的东西
Python切片是优雅的,因此像'xyz'[:30000]
这样的字符串切片的计算结果只是'xyz'
,而不是引发错误。由@m0nhawk建议的模块(仅Python 3.x)正是为此目的而设计的。以下是您将如何使用它:
如果您对默认限制没有问题,只需使用:
输出:
[[1, 2, 3], [0, 1, 2, 3, 4, 5, ...]]
[[1, 2, 3], [0, 1, 2, 3, ...], 'lo...ing', 'a', ...]
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...]]]]]]
为了自定义,只需创建一个
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, 4, 5, ...]]
[[1, 2, 3], [0, 1, 2, 3, ...], 'lo...ing', 'a', ...]
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...]]]]]]
如果您正在处理引用自身的sequence对象,则可以使用
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], [0, 1, 2, 3, 4, 5, ...]]
[[1, 2, 3], [0, 1, 2, 3, ...], 'lo...ing', 'a', ...]
[1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [1, 2, 3, [...]]]]]]
请注意,
reprlib.repr()
返回一个字符串,但不会打印它(除非您在交互式控制台中,输入的每个表达式的结果都会被计算并显示其表示形式) 如果你有带嵌套的字典,可能带参数depth
set会有帮助吗?@myaut这不完全是我想要的,但它真的很有帮助!谢谢您可以用@M0nHook定义自己的表示形式。我想就是这个了。你能把它从一个评论移到一个答案吗?这会很好的工作,除非它仍然需要很长时间才能运行。我有数十万个键的字典,它们的值是包含数百个项的列表。将它们转换为str
需要很长时间,因此理想情况下我希望避免这种情况。@max我认为调用str
几乎是不可避免的。您可以通过查看Python的特殊方法系统和\uuu str\uuu
来尝试更改str
的功能:但是,一个大问题是您无法更改内置类型(如dict
)的属性。我认为您可能需要在dict上实现自己的包装器类,然后用自己的自定义函数重写它的\uuu str\uu
函数。