函数中Python多行字符串的缩进方式是怎样的?

    def method():
        string = """line one
line two
line three"""

or

    def method():
        string = """line one
        line two
        line three"""

还是别的什么?

在第一个例子中,将字符串挂在函数外面看起来有点奇怪。


当前回答

我更喜欢

    def method():
        string = \
"""\
line one
line two
line three\
"""

or

    def method():
        string = """\
line one
line two
line three\
"""

其他回答

这取决于您希望文本如何显示。如果你想让它全部向左对齐,那么要么像第一个代码片段那样格式化它,要么遍历所有的行,向左修剪所有的空间。

第一个选项是好的-包括缩进。 它是python风格的-提供了代码的可读性。

正确显示:

print string.lstrip()

dedent函数允许在源代码中以正确的缩进开始,然后在使用之前将其从文本中剥离。

正如其他人所指出的那样,这是对字面量的额外函数调用;在决定在代码中放置这些文字的位置时,要考虑到这一点。

import textwrap

def frobnicate(param):
    """ Frobnicate the scrognate param.

        The Weebly-Ruckford algorithm is employed to frobnicate
        the scrognate to within an inch of its life.

        """
    prepare_the_comfy_chair(param)
    log_message = textwrap.dedent("""\
            Prepare to frobnicate:
            Here it comes...
                Any moment now.
            And: Frobnicate!""")
    weebly(param, log_message)
    ruckford(param)

日志消息字面量中尾随的\是为了确保换行符不在字面量中;这样,字面量就不会以空行开始,而是以下一行开始。

dedent的返回值是删除了字符串每行上所有常用前导空格缩进的输入字符串。所以上面的log_message值将是:

Prepare to frobnicate:
Here it comes...
    Any moment now.
And: Frobnicate!

使用检查。Cleandoc像这样:

import inspect

def method():
    string = inspect.cleandoc("""
        line one
        line two
        line three""")

相对压痕将按预期保持。正如下面所评论的,如果你想保持前面的空行,使用textwrap.dedent。但是,这也保留了第一个换行符。

注意:在相关上下文下缩进代码逻辑块以澄清结构是一种良好的实践。例如,多行字符串属于变量字符串。

我的观点是,转义行尾以获得缩进

def foo():
    return "{}\n"\
           "freq: {}\n"\
           "temp: {}\n".format( time, freq, temp )