Pythonの三重引用符で囲まれた複数行の文字列の余分なインデントを削除する方法は?
質問
ユーザーがスクリプトまたはコードを入力するpythonエディターがあり、それらはすべての行をインデントしながら、舞台裏でメインメソッドに入力されます。問題は、ユーザーが複数行の文字列を持っている場合、すべてのスペースにタブを挿入することにより、スクリプト全体に対して行われたインデントが文字列に影響することです。問題のスクリプトは、次のような単純なものになります。
"""foo
bar
foo2"""
したがって、メインメソッドでは次のようになります。
def main():
"""foo
bar
foo2"""
そして文字列はすべての行の先頭に余分なタブを持っています。
解決
したがって、正しく取得できたら、ユーザーが入力したものをすべて取得し、適切にインデントして、プログラムの残りの部分に追加します(そして、そのプログラム全体を実行します)。
したがって、ユーザー入力をプログラムに入力した後、基本的に強制インデントを取り戻す正規表現を実行できます。次のようなもの:3つの引用符内で、すべての「改行マーカー」を置き換えます。 「改行マーカー」のみの4つのスペース(またはタブ)が続きます。
他のヒント
textwrap.dedent は自動的に元に戻すためのものです。奇抜なインデント。
私が見たものから、ここでより良い答えは inspect.cleandoc
かもしれません。 .dedent は先頭の行にあります。以下の例は違いを示しています。
>>> import textwrap
>>> import inspect
>>> x = """foo bar
baz
foobar
foobaz
"""
>>> inspect.cleandoc(x)
'foo bar\nbaz\nfoobar\nfoobaz'
>>> textwrap.dedent(x)
'foo bar\n baz\n foobar\n foobaz\n'
>>> y = """
... foo
... bar
... """
>>> textwrap.dedent(y)
'\nfoo\nbar\n'
>>> inspect.cleandoc(y)
'foo\nbar'
複数行の文字列の最初の行に続くものは文字列の一部であり、パーサーによってインデントとして扱われません。あなたは自由に書くことができます:
def main():
"""foo
bar
foo2"""
pass
それは正しいことをします。
一方、それは読めません。Pythonはそれを知っています。したがって、docstringの second 行に空白が含まれている場合、 help()
を使用してdocstringを表示すると、その空白が除去されます。したがって、 help(main)
と以下の help(main2)
は同じヘルプ情報を生成します。
def main2():
"""foo
bar
foo2"""
pass
私が見る唯一の方法は、2行目から始まる各行の最初のn個のタブを取り除くことです。ここで、nはmainメソッドの既知の識別です。
その識別情報が事前にわからない場合-挿入する前に末尾の改行を追加し、最後の行からタブの数を削除することができます...
3番目の解決策は、データを解析して複数行の引用符の始まりを見つけ、閉じられるまですべての行に識別子を追加しないことです。
より良い解決策があると考えてください。