函数中Python多行字符串的缩进方式是怎样的?
def method():
string = """line one
line two
line three"""
or
def method():
string = """line one
line two
line three"""
还是别的什么?
在第一个例子中,将字符串挂在函数外面看起来有点奇怪。
函数中Python多行字符串的缩进方式是怎样的?
def method():
string = """line one
line two
line three"""
or
def method():
string = """line one
line two
line three"""
还是别的什么?
在第一个例子中,将字符串挂在函数外面看起来有点奇怪。
当前回答
使用检查。Cleandoc像这样:
import inspect
def method():
string = inspect.cleandoc("""
line one
line two
line three""")
相对压痕将按预期保持。正如下面所评论的,如果你想保持前面的空行,使用textwrap.dedent。但是,这也保留了第一个换行符。
注意:在相关上下文下缩进代码逻辑块以澄清结构是一种良好的实践。例如,多行字符串属于变量字符串。
其他回答
我更喜欢
def method():
string = \
"""\
line one
line two
line three\
"""
or
def method():
string = """\
line one
line two
line three\
"""
这取决于您希望文本如何显示。如果你想让它全部向左对齐,那么要么像第一个代码片段那样格式化它,要么遍历所有的行,向左修剪所有的空间。
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!
对于字符串,可以直接处理字符串。对于文档字符串,您需要在之后处理函数。这里有一个解决方案,这两个仍然是可读的。
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__
一个选项似乎在其他答案中遗漏了(只在naxa的评论中提到过):
def foo():
string = ("line one\n" # Add \n in the string
"line two" "\n" # Add "\n" after the string
"line three\n")
这将允许适当的对齐,隐式地连接行,并仍然保持行移位,对我来说,这是为什么我想使用多行字符串的原因之一。
它不需要任何后处理,但您需要手动在希望该行结束的任何给定位置添加\n。可以内联,也可以作为单独的字符串。后者更容易复制粘贴进来。