reprint 是一个适用于 Python 2/3 的简易变量绑定与多行输出刷新的库
模块内对于 Unicode 字符宽度的计算参考了 urwid项目 内的解决方案
- 同时支持 Python 2/3
- 简易变量绑定,内容修改时自动刷新命令行输出
- 多行输出刷新,实现不同行内容由独立变量控制,修改特定变量即能刷新命令行中特定行的内容
- 多线程安全,使用了
threading.Lock
实现线程安全
pip install reprint
- 导入
output
对象
from reprint import output
-
使用 Python 的
with
语句来进行输出对象的初始化与对象控制,其中output
对象包含以下参数可选:output_type
:"list"
或"dict"
, 分别对应 list 模式与 dict 模式, 默认为"list"
initial_len
:int
, 只在 list 模式下有效,指定 list 的初始长度,便于直接使用下标修改而不需初始化, 默认为1
interval
:int
, 指定输出的刷新最小间隔,只有两次刷新间隔的毫秒数大于此数才会触发命令行输出刷新, 默认为0
with output(output_type="list", initial_len=1, interval=0) as output_list:
-
修改
output_list
对象内的内容即会刷新命令行内容
-
在
with
块内,任何print
、logging
或Exception
等其他命令行输出都可能会导致输出格式异常,如果需要追加内容,请使用output
对象的append
函数(list 与 dict 模式都可用) -
在 dict 模式的
output
对象中包含一个名为sublist
的list
对象,用于在 dict 模式中追加内容。你可以通过output.sublist
来直接操作修改其内容。 -
请勿直接给
output
对象赋予list
或dict
等对象,如果需要整体内容替换,请使用output
对象的change
函数(list 与 dict 模式都可用) -
当输出内容行数超过当前命令行高度时会导致消息清除不完整。所以若在意输出完成后,命令行的整洁度,请注意控制输出内容的行数。
- 或者你可以选择使用
force_single_line
,强制输出内容不会换行。
with output(output_type="list", initial_len=1, interval=0, force_single_line=True) as output_list:
- 或者你可以选择使用
-
线程内调用请注意线程的初始化应被包含在
with
代码块内 -
由于需要获取终端宽度,在非终端环境无法正常使用,非终端环境转化为普通命令行输出
-
不支持 IDLE 以及其他无法获取到终端大小的环境
Q: 我想在使用 dict
模式时用自己的排序函数对输出的行进行排序,如何实现?
A: 你可以在初始化 output
对象的时候用 sort_key
参数来传递你自己的排序函数,例如:
with output(output_type='dict', sort_key=lambda x:x[1]) as output_lines:
之后 reprint
就会使用你所传入的函数来作为 sorted
函数的 key
参数,对输出的行进行排序:
elif isinstance(content, dict):
for k, v in sorted(content.items(), key=sort_key):
print("{}: {}".format(k, v))
Q: 如何禁用所有的警告信息?
A: 你可以在初始化 output
对象的时候指定 no_warning
参数为 True
来禁用警告,例如:
with output(no_warning=True) as output_list: