如何在Python CLI待办工具中格式化需保留缩进的多行字符串?
Python待办CLI测试:多行字符串缩进规范与预期格式兼顾方案
我开发的Python待办事项CLI工具要求,列表项打印到终端时数字缩进自动对齐——个位数前加空格,两位数顶格,比如:
8 - Eight 9 - Nine 10 - Ten
写测试函数验证缩进格式时,需要把预期输出存为多行字符串。如果按常规代码缩进规范对齐字符串,会破坏预期的格式;目前只能把字符串顶格写,这违反了Python代码格式化规范。
解决方案:用textwrap.dedent兼顾规范与格式
Python标准库的textwrap.dedent可以自动移除多行字符串中所有行的最小共同前缀缩进,既能让字符串和代码缩进对齐,又能保留预期的格式细节。
修改后的测试代码示例
import textwrap from unittest.mock import patch, mock_open # 假设你的测试类和Handler类已定义 def test_a_long_list(self): """Test that we can show a long list going into double figures""" with patch( "todo.open", mock_open( read_data="One\nTwo\nThree\nFour\nFive\nSix\nSeven\nEight\nNine\nTen\nEleven" ), ): Handler().list() expected = textwrap.dedent("""\ 1 One 2 Two 3 Three 4 Four 5 Five 6 Six 7 Seven 8 Eight 9 Nine 10 Ten 11 Eleven --- 11 item(s) """) self.assertPrinted(expected)
原理说明
- 把预期字符串的每一行按代码缩进对齐(示例中用4个空格前缀),但两位数的行调整为少1个空格(3个空格前缀);
textwrap.dedent会识别所有行的最小共同前缀缩进(这里是3个空格),并移除每一行的该前缀:- 个位数行原本的4个空格去掉3个,剩下1个,正好是
1 One的格式; - 两位数行原本的3个空格去掉3个,变成
10 Ten,完全符合要求; - 分隔线和统计行的4个空格去掉3个,变成
---和11 item(s),匹配预期输出。
- 个位数行原本的4个空格去掉3个,剩下1个,正好是
这样既遵守了Python代码缩进规范,又能得到完全符合要求的预期字符串。
内容的提问来源于stack exchange,提问作者DishiestAlarm
相关产品推荐
相关产品推荐

