我有一个python编辑器,用户输入一个脚本或代码,然后将其放入幕后的main方法中,同时每行都缩进。问题是如果用户有多行字符串,则通过在每个空格中插入制表符,对整个脚本的缩进会影响字符串。问题脚本将是如此简单:

"""foo
bar
foo2"""

因此,在主方法中,它看起来像:

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

并且字符串现在在每行的开头都有一个额外的标签。

有帮助吗?

解决方案

因此,如果我正确理解,您可以接受用户输入的任何内容,将其缩进并将其添加到程序的其余部分(然后运行整个程序)。

因此,在将用户输入放入程序后,您可以运行正则表达式,基本上将强制缩进恢复。类似于:在三个引号内,替换所有“新行标记”然后是四个空格(或制表符),只有一个“新行标记”。

其他提示

从标准库 textwrap.dedent 自动撤消古怪的缩进。

从我看到的,这里更好的答案可能是 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'

多行字符串的第一行后面的内容是字符串的一部分,并且不被解析器视为缩进。你可以随意写:

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

它会做正确的事。

另一方面,这是不可读的,Python知道它。因此,如果docstring在其 second 行中包含空格,则在使用 help()查看docstring时,会删除该空白量。因此, help(main)和下面的 help(main2)会产生相同的帮助信息。

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

我看到的唯一方法是从第二行开始为每行删除前n个制表符,其中n是main方法的已知标识。

如果事先不知道该标识 - 您可以在插入之前添加尾随换行符并从最后一行删除标签数量...

第三个解决方案是解析数据并找到多行引用的开头,并且在关闭之前不要将你的标识添加到每一行。

认为有更好的解决方案..

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top