函数中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\
"""

其他回答

你可能想和""对齐

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

由于换行符和空格包含在字符串本身中,因此必须对其进行后处理。如果你不想这样做,而你有很多文本,你可能想把它们单独存储在一个文本文件中。如果一个文本文件不适合你的应用程序,而你不想进行后期处理,我可能会选择

def foo():
    string = ("this is an "
              "implicitly joined "
              "string")

如果你想对一个多行字符串进行后处理,去掉你不需要的部分,你应该考虑textwrap模块或PEP 257中提供的后处理文档字符串的技术:

def trim(docstring):
    if not docstring:
        return ''
    # Convert tabs to spaces (following the normal Python rules)
    # and split into a list of lines:
    lines = docstring.expandtabs().splitlines()
    # Determine minimum indentation (first line doesn't count):
    indent = sys.maxint
    for line in lines[1:]:
        stripped = line.lstrip()
        if stripped:
            indent = min(indent, len(line) - len(stripped))
    # Remove indentation (first line is special):
    trimmed = [lines[0].strip()]
    if indent < sys.maxint:
        for line in lines[1:]:
            trimmed.append(line[indent:].rstrip())
    # Strip off trailing and leading blank lines:
    while trimmed and not trimmed[-1]:
        trimmed.pop()
    while trimmed and not trimmed[0]:
        trimmed.pop(0)
    # Return a single string:
    return '\n'.join(trimmed)

我来这里寻找一个简单的1-liner来删除/纠正打印文档字符串的标识级别,而不会使它看起来不整洁,例如通过使它在脚本中“悬挂在函数之外”。

这是我最后做的:

import string
def myfunction():

    """
    line 1 of docstring
    line 2 of docstring
    line 3 of docstring"""

print str(string.replace(myfunction.__doc__,'\n\t','\n'))[1:] 

显然,如果你使用空格缩进(例如4)而不是制表键,可以使用这样的方法:

print str(string.replace(myfunction.__doc__,'\n    ','\n'))[1:]

如果你想让你的文档字符串看起来像这样,你不需要删除第一个字符:

    """line 1 of docstring
    line 2 of docstring
    line 3 of docstring"""

print string.replace(myfunction.__doc__,'\n\t','\n') 

使用检查。Cleandoc像这样:

import inspect

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

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

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

对于字符串,可以直接处理字符串。对于文档字符串,您需要在之后处理函数。这里有一个解决方案,这两个仍然是可读的。

class Lstrip(object):
    def __rsub__(self, other):
        import re
        return re.sub('^\n', '', re.sub('\n$', '', re.sub('\n\s+', '\n', other)))

msg = '''
      Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
      tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
      veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
      commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
      velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
      cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
      est laborum.
      ''' - Lstrip()

print msg

def lstrip_docstring(func):
    func.__doc__ = func.__doc__ - Lstrip()
    return func

@lstrip_docstring
def foo():
    '''
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
    veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
    commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
    velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
    cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
    est laborum.
    '''
    pass


print foo.__doc__

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!