我正在尝试使用 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
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>
在这种情况下,有
common 前导空格,因此它们被删除。
编辑:如果您想一起摆脱
\
,您可以考虑使用
"""My sentence"""
代替message
中的def bar
。
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))