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 \これは、出力されたものを実際に解析する必要があるためです\\1つだけ印刷され\、それはあなたが望むものです。句\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

質問の 2 番目の部分では、次の単純な置換でニーズがカバーされます: 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 に答える