如何删除Python的三重报价多行字符串的额外缩进?(How to remove extra ind

2019-07-17 18:07发布

我有其中用户输入脚本或代码,然后将其放入幕后的重要手段,同时还具有缩进每行一个Python编辑器。 问题是,如果用户有一个多行字符串,整个脚本所做的压痕影响字符串,通过在每一个空间插入选项卡。 一个问题脚本是这么简单的东西如:

"""foo
bar
foo2"""

因此,当在main方法它会是什么样子:

def main():
    """foo
    bar
    foo2"""

和字符串现在将不得不在每行的开始一个额外的标签。

Answer 1:

所以,如果我正确地得到它,你采取任何用户输入正确的缩进,并把它添加到你的程序的其余部分(然后运行整个程序)。

所以你把用户输入到你的程序后,你可以运行一个正则表达式,基本上采取的是强制缩进回来。 是这样的:在3个报价,只有一个“新行标记”全部替换“新行标志”后面四个空格(或标签)。



Answer 2:

textwrap.dedent标准库中是有自动撤消古怪的压痕。



Answer 3:

从我所看到的,在这里一个更好的答案可能是inspect.cleandoc ,这确实在功能上有什么textwrap.dedent确实也解决了问题, textwrap.dedent与领先的线。 下面的例子示出的差异:

   >>> import textwrap
   >>> import inspect
   >>> x = """foo bar
       baz
       foobar
       foobaz
       """
   >>> inspect.cleandoc(x)
   'foo bar\nbaz\nfoobar\nfoobaz'
   >>> textwrap.dedent(x)
   'foo bar\n    baz\n    foobar\n    foobaz\n'
   >>> y = """
   ...     foo
   ...     bar
   ... """
   >>> textwrap.dedent(y)
   '\nfoo\nbar\n'
   >>> inspect.cleandoc(y)
   'foo\nbar'


Answer 4:

接下来一个多行字符串的第一行是字符串的一部分,而不应被视为解析器缩进。 你可以自由地写:

def main():
    """foo
bar
foo2"""
    pass

它会做正确的事。

在另一方面,这不是可读的,Python知道它。 所以,如果一个文档字符串包含空格,在它的第二行,空白的那个量,当您使用扒掉help()查看文档字符串。 因此, help(main)和下面的help(main2)产生相同的帮助信息。

def main2():
    """foo
    bar
    foo2"""
    pass


Answer 5:

我看到的唯一方式 - 是剥去第一n凸片每行开始第二,其中n是已知的主要方法identation。

如果identation事先不知道 - 你可以添加插入之前换行符和最后一行剥去标签的数...

第三种解决方案是分析数据,发现多报价的开始,不,直到它会被关闭后,您identation添加到每一行。

认为这是一个更好的解决方案..



文章来源: How to remove extra indentation of Python triple quoted multi-line strings?