【问题标题】:What is causing "triple quotes" to change the indentation?是什么导致“三引号”改变缩进?
【发布时间】:2021-10-13 21:08:38
【问题描述】:

我正在使用三引号来创建多行字符串:

print(
    ''' Hello!
        How are
        you?''')

输出:

 Hello!
        How are
        you?

在字符串内部,How 正好位于 Hello 的下方。

但是,我无法理解导致缩进发生变化的原因。

【问题讨论】:

  • 没有改变它。这与字符串内部的缩进相同。
  • 但在字符串内部,How 正好位于 Hello 的下方。
  • 可以,但是前一行的字符大多是not在字符串中。
  • 在您的字符串中,您有 Hello!然后是换行符,然后是 8 个空格,然后如何。这就是它正在打印的内容。如果您不想打印这 8 个空格,请将它们从字符串文字中取出。
  • 建议添加一个新的字符串前缀以简化此操作:discuss.python.org/t/indented-multi-line-string-literals/9846

标签: python python-3.x string


【解决方案1】:

为了回答这个问题,字符串中的空格数完全正确,三引号不会改变缩进。

要回答问题背后的问题,如果要删除 common 前导空格,请使用 textwrap.dedent,以便多行字符串在源代码中仍然可以很好地排列:

>>> print(dedent('''\
...           Hello!
...           How are
...           you?'''))
Hello!
How are
you?

您可能也有兴趣关注Compile time textwrap.dedent() equivalent for str or bytes literals

【讨论】:

    【解决方案2】:

    当您像这样使用三引号时,生成的字符串将包含三引号之间的所有字符,包括空格和换行符。

    那么,让我们再看看您的代码。它看起来像这样:

        ''' Hello!
            How are
            you?'''
    

    如果我们仔细观察这段代码,我们可以看到它包括:

    • 4 个空格
    • 三重引号'''
    • 1 个空格
    • Hello!
    • 换行
    • 8 个空格
    • 文字How are
    • 换行
    • 8 个空格
    • you?
    • 三重引号'''

    因此,生成的字符串将包含三引号之间的所有字符,即:

    • 1 个空格
    • Hello!
    • 换行
    • 8 个空格
    • 文字How are
    • 换行
    • 8 个空格
    • you?

    如您所见,这正是打印出来的内容。

    【讨论】:

      【解决方案3】:

      让我们看看 Python 文档:

      Python 中的文本数据由 str 对象或字符串处理。字符串是 Unicode 代码点的不可变序列。字符串字面量有多种写法:

      单引号:'允许嵌入“双”引号'

      双引号:“允许嵌入‘单’引号”。

      三引号:'''三个单引号''', """三个双引号"""

      三引号字符串可能跨越多行 - 所有相关的空格都将包含在字符串文字中。

      我不确定您想要的输出是什么,但简短的回答是 Python 从字面上解释三引号内的空格;这就是它包含在打印输出中的原因。

      【讨论】:

        【解决方案4】:

        试试这个

        print(f''' 
        Hello!
        How are
        you?''')
        

        【讨论】:

        • 为什么是 f-string?
        • 好问题。不一定,但我习惯于默认使用 f 字符串,除非某些字符(如括号)会导致问题,在这种情况下我使用 r 字符串。如果您愿意,可以在此处删除 f
        • 为什么?除非您实际上将某些内容格式化到其中(并且除非在特定实现中有特殊的大小写),否则您不需要开销。
        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-02
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 2018-07-14
        相关资源
        最近更新 更多