我正在尝试使用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
答案 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))