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
函数。