使用doctest测试pandas时,如何固定输出示例的列数?
问题
我有一个包含多个输出pandas DataFrame方法的包,想用pytest结合doctest测试示例,按照pytest doctest集成的要求,测试时需要输出的DataFrame列数与示例完全一致。但运行pytest --doctest-modules时出错:示例里显示完整7列,实际输出却用省略号隐藏了部分列,具体差异如下:
示例代码及预期输出:
>>> import pandas >>> df = pandas.DataFrame({"variable_1": range(3)}) >>> for i in range(2, 8): df["variable_"+str(i)] = range(3) >>> df variable_1 variable_2 variable_3 variable_4 variable_5 variable_6 variable_7 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2
实际错误差异:
Differences (unified diff with -expected +actual): @@ -1,4 +1,6 @@ - variable_1 variable_2 variable_3 variable_4 variable_5 variable_6 variable_7 -0 0 0 0 0 0 0 0 -1 1 1 1 1 1 1 1 -2 2 2 2 2 2 2 2 + variable_1 variable_2 variable_3 ... variable_5 variable_6 variable_7 +0 0 0 0 ... 0 0 0 +1 1 1 1 ... 1 1 1 +2 2 2 2 ... 2 2 2 +<BLANKLINE> +[3 rows x 7 columns]
想知道:有没有办法固定输出列数?doctest的终端输出是否始终固定?
解决方法
固定pandas显示参数:pandas会根据终端宽度自动截断列,要强制显示所有列,在doctest示例开头添加以下配置:
>>> import pandas as pd >>> pd.set_option('display.max_columns', None) # 显示全部列 >>> pd.set_option('display.width', None) # 适配列宽,避免换行截断加入这些设置后,DataFrame会输出完整的所有列,和示例匹配。
临时设置避免全局影响:如果不想全局修改pandas配置,可使用上下文管理器临时调整:
>>> import pandas as pd >>> with pd.option_context('display.max_columns', None, 'display.width', None): ... print(df)该设置仅在当前代码块内生效,不会干扰其他测试用例。
关于doctest输出的固定性:doctest的输出本身是固定的,但pandas的输出依赖自身显示配置和运行环境的终端宽度。只要统一设置pandas的显示参数,就能保证doctest输出稳定一致,不会出现省略号或格式差异。
内容的提问来源于stack exchange,提问作者Paul Rougieux
相关产品推荐
相关产品推荐

