删除反斜杠延续字符

时间:2012-11-09 11:59:52

标签: python

我正在尝试使用AST解析一些代码,但由于反斜杠延续字符,我遇到了问题。

当我有一个延续字符 \ 时,textwrap将无法设法代码,我想知道如何摆脱它。

code = """
    def foo():
        message = "This is a very long message that will probably need to wrap at the end of the line!\n \
And it actually did!"
"""

import textwrap
print textwrap.dedent(code)

import ast
ast.parse(textwrap.dedent(code))

我正在添加更多详细信息以澄清问题:

我有一个模块nemo.py,内容如下:

class Foo(object):

    def bar(self):
        message = "This is a very long message that will probably need to wrap at the end of the line!\n \
And it actually did!"

并且主模块试图解析代码:

import ast
import nemo
import inspect
import textwrap

code = str().join(inspect.getsourcelines(nemo.Foo.bar)[0])
ast.parse(textwrap.dedent(code))

追溯:

Traceback (most recent call last):
  File "/Users/kelsolaar/Documents/Development/Research/_BI.py", line 7, in <module>
    ast.parse(textwrap.dedent(code))
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/ast.py", line 37, in parse
    return compile(source, filename, mode, PyCF_ONLY_AST)
  File "<unknown>", line 1
    def bar(self):
    ^
IndentationError: unexpected indent

2 个答案:

答案 0 :(得分:2)

这是因为你误解了textwrap.dedent()的作用。

删除任何 常见 前导空格。在您的情况下,没有共同的前导空格,因此没有删除任何内容。

此外,在这种情况下,您想要的实际上是\\而不是\n \。这是因为您实际上想要解析打印的内容。 \\只打印一个\,这就是您想要的。 \n \将在"..."子句中打印一个无效的新行。

现在考虑以下代码:

>>> code = """
    def foo():
        message = "This is a very long message that will probably need to wrap at the end of the line! \\
    And it actually did!"
"""

>>> print textwrap.dedent(code)

def foo():
    message = "This is a very long message that will probably need to wrap at the e
nd of the line! \
And it actually did!"

>>> ast.parse(textwrap.dedent(code))
<_ast.Module object at 0x10e9e5bd0>

在这种情况下, 常见 前导空格,因此会将其删除。


编辑:

如果您想要同时删除\所有内容,可以考虑在"""My sentence"""中使用message def bar

答案 1 :(得分:0)

对于问题的第二部分,以下简单替换涵盖了我的需求: code.replace(“\\ n”,str())

import ast
import nemo
import inspect
import textwrap

code = str().join(inspect.getsourcelines(nemo.Foo.bar)[0])
code.replace("\\\n", str())
ast.parse(textwrap.dedent(code))