You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

原理说明

  1. 把预期字符串的每一行按代码缩进对齐(示例中用4个空格前缀),但两位数的行调整为少1个空格(3个空格前缀);
  2. textwrap.dedent会识别所有行的最小共同前缀缩进(这里是3个空格),并移除每一行的该前缀:
    • 个位数行原本的4个空格去掉3个,剩下1个,正好是 1 One的格式;
    • 两位数行原本的3个空格去掉3个,变成10 Ten,完全符合要求;
    • 分隔线和统计行的4个空格去掉3个,变成---和11 item(s),匹配预期输出。

这样既遵守了Python代码缩进规范,又能得到完全符合要求的预期字符串。

内容的提问来源于stack exchange,提问作者DishiestAlarm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 02:12:27