2009-09-11 15 views
33

私は、スクリプトやコードを入力するPythonエディタを用意しています。このエディタは、バックグラウンドのメインメソッドに入れられ、すべての行がインデントされます。問題は、ユーザーに複数行の文字列がある場合、スクリプト全体に施されたインデントが、すべてのスペースにタブを挿入することによって文字列に影響を与えることです。 mainメソッドでは、それは次のようになりますときにPython三重引用符で囲まれた複数行の文字列の余分なインデントを削除するにはどうすればよいですか?

"""foo 
bar 
foo2""" 

def main(): 
    """foo 
    bar 
    foo2""" 

と文字列は今、すべての行の先頭に余分なタブを持つことになり、問題のスクリプトは、ほど簡単なものになるだろう。

+0

http://codereview.stackexchange.com/questions/60366/avoiding-python-multiline-string-indentation –

答えて

0

私はそれを正しく取得するのであれば、あなたは、どのようなユーザ入力を取り、それを正しくインデントし、プログラムの残りの部分にそれを追加(およびその全体のプログラムを実行します)。

ユーザー入力をプログラムに入れた後、基本的に強制インデントを取り戻す正規表現を実行できます。何かが好きです:3つの引用符の中で、すべての "新しい行マーカー"とそれに続く "新しい行マーカー"だけを持つ4つのスペース(またはタブ)を置き換えます。

+0

うん、正確に。それが私が思いついた唯一の解決策です。なぜ私はそれを先に進まなかったのか分かりません...もっとうまくいくものがなければ、これをしなければならないかもしれないと思います。 –

+12

@traxilの提案であるtextwrap.dedentを使用する方法があります。受け入れられた答えを変更することを検討してください –

1

私が見る唯一の方法は、各行の最初のn個のタブを2番目の行から取り除くことです。ここでnはmainメソッドの名前です。

そのインデントが事前に知られていない場合 - あなたはそれを挿入する前に改行を追加して、最後の行からタブの数を取り除くことができます...

第三ソリューションは、データを解析し、複数行の引用の始まりを見つけることですし、閉じられるまで、あなたのアイデンティティをすべての行に追加しないでください。

は、より良い解決策..複数行の文字列の最初の行を以下の文字列の一部であり、パーサによってインデントとして扱われていない何

+0

ありがとう:たとえば、以下の相違点を示しています。だから私は、挿入されたインデントの各行を取り除くことを提案していますか?私は混乱しています... –

15

があると思います。

def main(): 
    """foo 
bar 
foo2""" 
    pass 

と自由に書くことができます。

一方、それは読めないので、pythonはそれを知っています。そのため、文書の文字列に空白が含まれている場合、help()を使用して文書の文字列を表示すると、その空白が取り除かれます(の第2の行)。したがって、help(main)と以下のhelp(main2)は、同じヘルプ情報を生成します。

def main2(): 
    """foo 
    bar 
    foo2""" 
    pass 
+0

返信ありがとうございます。残念ながら、インデントは完全に自動化されています。私のコードは文字列(Javaの場合)としてスクリプトを読み込み、その文字列のすべての行をインデントします。 –

+0

ああ、私は参照してください。私はこのために助けを使うことはできません...しかし、感謝! –

79

textwrap.dedent標準ライブラリからは、不自然なインデントが自動的に取り消されます。

+1

きちんとしたことを知りませんでした。:) – Macke

+1

標準ライブラリは驚きを止めることはありません。 – thraxil

+0

非常にクールな情報。私はそれを使用することはできません。 –

4

私が見るところでは、より良い答えはinspect.cleandocであり、機能的にはtextwrap.dedentと同じですが、textwrap.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' 
関連する問題