使用多行字符串时的缩进

Bas*_*asj 1 python string nested code-readability multilinestring

我有时需要使用多行字符串,但在嵌套块中。这有效,但可读性真的很差:

CONDITION1 = CONDITION2 = CONDITION3 = True

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
dfkjslfds
sqjdlqkj"""
    elif CONDITION3:
        s = """azeazea
azeoiuaez
azeytzae
azetzae"""
Run Code Online (Sandbox Code Playgroud)

使用:

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
               dfkjslfds
               sqjdlqkj"""
Run Code Online (Sandbox Code Playgroud)

(如Pythonic way to create a long multi-line string所建议的那样)不是一个选项,因为该字符串s将是:

jkljkj
               dfkjslfds
               sqjdlqkj
Run Code Online (Sandbox Code Playgroud)

带有不需要的左侧空格。

问题:如何在可读性好的嵌套块中使用多行字符串?

Sha*_*ger 6

将字符串包装在调用中inspect.cleandoc,它将与清理文档字符串相同的方式清理它(删除前导和尾随空格,以及任何级别的常见缩进)。

>>> import inspect
>>> s = """jkljkj
...        dfkjslfds
...        sqjdlqkj"""
...
>>> print(s)
jkljkj
       dfkjslfds
       sqjdlqkj
>>> s = inspect.cleandoc(s)
>>> print(s)
jkljkj
dfkjslfds
sqjdlqkj
Run Code Online (Sandbox Code Playgroud)

textwrap.dedent也是一种选择,但它更丑陋,因为它要求您在第一行不放置任何文本,并明确使用行继续符来确保每一行(不仅仅是第二行及以后)具有相同的前导缩进:

>>> print(textwrap.dedent('''\
...                       The^backslash is a pain
...                       so I don't recommend this approach
...                       '''))
The^backslash is a pain
so I don't recommend this approach
Run Code Online (Sandbox Code Playgroud)

请注意,虽然 SO 上的代码块没有正确显示它,但dedent留下了空的最后一行(将关闭'''放在一行上),在哪里cleandoc可以删除它。