87

私は、ユーザーがスクリプトまたはコードを入力しているPythonエディターを持っています。これは、すべての行をインデントしながら、バックグラウンドでmainメソッドに配置されます。問題は、ユーザーが複数行の文字列を持っている場合、すべてのスペースにタブを挿入することにより、スクリプト全体に加えられたインデントが文字列に影響を与えることです。問題のあるスクリプトは、次のような単純なものになります。

"""foo
bar
foo2"""

したがって、メインメソッドでは次のようになります。

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

文字列には、すべての行の先頭に追加のタブがあります。

4

7 に答える 7

20

複数行の文字列の最初の行に続くものは文字列の一部であり、パーサーによってインデントとして扱われません。あなたは自由に書くことができます:

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

そしてそれは正しいことをします。

一方で、それは読み取り不能であり、Python はそれを認識しています。そのため、docstring の2help()行目に空白が含まれている場合、 を使用して docstring を表示すると、その量の空白が取り除かれます。したがって、help(main)以下help(main2)は同じヘルプ情報を生成します。

def main2():
    """foo
    bar
    foo2"""
    pass
于 2009-09-11T18:12:23.513 に答える
1

私が見る唯一の方法は、2番目から始まる各行の最初のn個のタブを削除することです。ここで、nはメインメソッドの既知のインデントです。

そのインデントが事前にわからない場合は、挿入する前に末尾の改行を追加して、最後の行からタブの数を削除できます...

3番目の解決策は、データを解析して複数行の引用符の先頭を見つけ、閉じられるまですべての行にインデントを追加しないことです。

より良い解決策があると思います。

于 2009-09-11T18:06:21.970 に答える
-15

したがって、私が正しく取得できれば、ユーザーが入力したものをすべて取得し、適切にインデントして、プログラムの残りの部分に追加します (そして、そのプログラム全体を実行します)。

したがって、ユーザー入力をプログラムに入力した後、正規表現を実行できます。これにより、基本的に強制的なインデントが元に戻ります。のようなもの: 3 つの引用符内で、すべての「改行マーカー」とそれに続く 4 つのスペース (またはタブ) を「改行マーカー」のみに置き換えます。

于 2009-09-11T18:35:43.207 に答える