适用于Python多行string的缩进

Python函数中多行string的正确缩进是什么?

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

要么

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

或者是其他东西?

在第一个例子中,将string悬挂在函数外面看起来有些奇怪。

你可能想要排队的"""

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

由于换行符和空格都包含在string本身中,所以必须对其进行后处理。 如果你不想这样做,而且你有很多的文本,你可能需要单独存储在一个文本文件。 如果一个文本文件不适合你的应用程序,并且你不想后处理,我可能会去

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

如果要后处理多行string以修剪不需要的部分,则应考虑用于后处理文档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) 

textwrap.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) 

日志消息文本中的尾部\确保换行符不在文字中; 这样,文字不会以空行开始,而是从下一行开始。

textwrap.dedent的返回值是inputstring,在string的每一行上都删除所有常见的前导空格缩进 ,这意味着除了进一步缩进的第三行之外,上面的log_message值将被刷新。

一些更多的select。 在启用pylab的Ipython中,dedent已经在命名空间中。 我检查了它是从matplotlib。 或者可以通过以下方式导入:

 from matplotlib.cbook import dedent 

在文档中,它指出它比textwrap更快,在我的ipythontesting中,它的速度比我的快速testing平均快了3倍。 它也有其优点,就是它放弃了所有的空白行,这使得您可以灵活地构buildstring:

 """ line 1 of string line 2 of string """ """\ line 1 of string line 2 of string """ """line 1 of string line 2 of string """ 

在这三个例子中使用matplotlib减号将给出相同的明智结果。 在第一个例子中,textwrap dedent函数将有一个空行。

显而易见的缺点是,textwrap在标准库中,而matplotlib是外部模块。

在这里进行一些权衡…在定义string的地方,缩进函数使得代码更易读,但是稍后需要处理以获得可用格式的string。 在文档string中,显然您应该使用正确的缩进,因为大多数文档string的使用都将执行所需的处理。

当我在我的代码中需要一个非长的string时,我发现下面的代码很丑,我让长string从封闭的缩进中退出。 绝对不能说“美丽胜于丑陋”,但有人可能会认为这比“替身”更简单,更明确。

 def example(): long_string = '''\ Lorem ipsum dolor sit amet, consectetur adipisicing 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.\ ''' return long_string print example() 

似乎从其他答案中缺less的一个选项(只在纳萨的评论中提到)如下:

 def foo(): string = ("line one\n" # Add \n in the string "line two" "\n" # Add "\n" after the string "line three\n") 

这将允许适当的alignment,隐式地join行,并且仍然保持行转移,对于我来说,这是我想要使用多行string的原因之一。

它不需要任何后处理,但是你需要手动添加\n在任何给定的地方,你想要行结束。 内联或作为一个单独的string之后。 后者更容易复制粘贴。

如果你想要一个快速简单的解决scheme,并且不用input换行符,你可以select一个列表,例如:

 def func(*args, **kwargs): string = '\n'.join([ 'first line of very long string and', 'second line of the same long thing and', 'third line of ...', 'and so on...', ]) print(string) return 

我的两个美分,逃避行结束,以获得缩进:

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

我更喜欢

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

要么

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

我来到这里寻找一个简单的一行删除/更正打印的文档string的标识级别而不会使它看起来不整洁 ,例如,通过使它在脚本内“挂在function之外”。

这就是我最终做的事情:

 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)缩进而不是tab键,请使用类似下面的代码:

 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') 

我这样做…

  part = "".join([ "\x00\x00\x00\x00\x0C\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x0C\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x0C\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x0C\x00\x00\x00\x00\x00\x00\xFF\x00\x00\x00\x00", ]) 

不是我知道的最有效率,但它是整洁的,不需要“后处理”,并且对于大多数用例来说足够高性能。

这取决于你想如何显示文本。 如果你想把它全部左alignment,那么就像在第一个代码片段中那样格式化它,或者遍历所有的空格。

对于string,你可以在处理完string之后。 对于文档,您需要在处理函数之后进行。 这是一个仍然可读的解决scheme。

 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__