1

我正在尝试使用 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
4

2 回答 2

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"""for messagein def bar

于 2012-11-09T12:15:45.517 回答
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))
于 2012-11-09T12:49:05.113 回答