【问题标题】:Indentation when using multi-line strings使用多行字符串时的缩进
【发布时间】:2019-06-23 01:43:30
【问题描述】:

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

CONDITION1 = CONDITION2 = CONDITION3 = True

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
dfkjslfds
sqjdlqkj"""
    elif CONDITION3:
        s = """azeazea
azeoiuaez
azeytzae
azetzae"""

使用:

if CONDITION1:
    if CONDITION2:
        s = """jkljkj
               dfkjslfds
               sqjdlqkj"""

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

jkljkj
               dfkjslfds
               sqjdlqkj

有多余的空格。

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

【问题讨论】:

    标签: python string nested code-readability multilinestring


    【解决方案1】:

    将字符串包装在a call to inspect.cleandoc 中,它会像清理文档字符串一样清理它(删除前导和尾随空格,以及任何级别的常见缩进)。

    >>> import inspect
    >>> s = """jkljkj
    ...        dfkjslfds
    ...        sqjdlqkj"""
    ...
    >>> print(s)
    jkljkj
           dfkjslfds
           sqjdlqkj
    >>> s = inspect.cleandoc(s)
    >>> print(s)
    jkljkj
    dfkjslfds
    sqjdlqkj
    

    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
    

    请注意,虽然 SO 上的代码块没有正确显示,dedent 留下了空的最后一行(将结束的 ''' 单独放在一行上),cleandoc 会删除它。

    【讨论】:

    • 非常感谢!为了完整起见,您能否在dedent 中添加相同的示例? (如果你没问题,我也可以自己编辑)
    • @Basj:完成。我认为这通常是次等的解决方案,所以我不想强调它,但它偶尔有用。
    • 谢谢!我接受了你的回答。我认为dedent 在我们实际上想要保留特定缩进但只删除左侧空格时可能很有用。示例:print(textwrap.dedent(""" some indented python code here """)).
    【解决方案2】:

    您是否尝试过使用“\”。例如:

    if CONDITION1:
    
       if CONDITION2:
    
           s = "jkljkj "\
               "dfkjslfds "\
               "sqjdlqkj"
    

    【讨论】:

    • 谢谢,但也不是一个选项,因为我的多行字符串很长。我不想在每一行周围手动添加`" ... "`。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    相关资源
    最近更新 更多