Pythonで「予期しないインデント」エラーを修正するにはどうすればよいですか?
18 に答える
Python は、行頭のスペースを使用して、コード ブロックの開始と終了のタイミングを決定します。発生する可能性のあるエラーは次のとおりです。
予期しないインデント。このコード行は前のものよりも先頭に多くのスペースがありますが、前のものはサブブロックの開始ではありません (例: if/while/for ステートメント)。ブロック内のすべてのコード行は、まったく同じ文字列の空白で始まる必要があります。例えば:
>>> def a():
... print "foo"
... print "bar"
IndentationError: unexpected indent
これは、python をインタラクティブに実行する場合に特に一般的です。コマンドの前に余分なスペースを入れないようにしてください。(サンプル コードをコピー アンド ペーストするときは非常に面倒です!)
>>> print "hello"
IndentationError: unexpected indent
Unindent は、どの外側のインデント レベルとも一致しません。このコード行は、前のコード行よりも先頭のスペースが少なくなっていますが、同様に、それが含まれる可能性のある他のブロックとは一致しません。Python はそれがどこに行くのかを決めることができません。たとえば、次の場合、最終的な出力は if 句の一部になるはずですか?
>>> if user == "Joey":
... print "Super secret powers enabled!"
... print "Revealing super secrets"
IndendationError: unindent does not match any outer indentation level
インデントされたブロックが必要です。このコード行には、前の行と同じ数のスペースが先頭に含まれていますが、最後の行はブロック (if/while/for ステートメント、関数定義など) を開始することが予期されていました。
>>> def foo():
... print "Bar"
IndentationError: expected an indented block
何もしない関数が必要な場合は、「no-op」コマンドpass を使用します。
>>> def foo():
... pass
タブとスペースの混在は許可されていますが (少なくとも私のバージョンの Python では)、Python はタブの長さが 8 文字であると想定しているため、エディターと一致しない場合があります。タブに「いいえ」と言うだけです。ほとんどのエディターでは、スペースを自動的に置き換えることができます。
これらの問題を回避する最善の方法は、サブブロックをインデントするときに常に一貫した数のスペースを使用し、理想的には問題を解決する優れた IDE を使用することです。これにより、コードが読みやすくなります。
Python では、間隔が非常に重要です。これにより、コード ブロックの構造が決まります。このエラーは、次のようにコード構造を台無しにすると発生します。
def test_function() :
if 5 > 3 :
print "hello"
ファイルにタブとスペースが混在している場合もあります。
PyScripterやNetbeansなどの Python 構文対応エディターを使用することをお勧めします。
-tt オプションを指定してコードを実行し、タブとスペースの使用に一貫性がないかどうかを確認します
使用しているエディターで表示される空白をオンにし、タブをスペースに置き換えるをオンにします。
Pythonでタブを使用することはできますが、タブとスペースを混在させると、通常、発生しているエラーが発生します。タブを4つのスペースに置き換えることは、Pythonコードを作成するための推奨されるアプローチです。
正しいインデントを使用する。Python は空白を認識しているため、ブロックのインデント ガイドラインに従う必要があります。そうしないと、インデント エラーが発生します。
Sublime を使用して Python を作成していて、インデント エラーが発生した場合は、
ビュー -> インデント -> インデントをスペースに変換
私が説明している問題は、Sublime テキスト エディターが原因です。同じ問題は、他のエディターによっても発生する可能性があります。基本的に、この問題は、インデントをスペースで処理したい Python と、インデントをタブでコーディングしているさまざまなエディターに関係しています。
エディターで「タブの代わりにスペースを挿入する」オプションを使用していることを確認してください。次に、たとえば 4 のタブ幅を選択できます。これらのオプションは、gedit の edit-->preferences-->editor の下にあります。
結論:タブではなくスペースを使用してください
いつも私のために働いたトリックがあります:
予期しないインデントが発生し、すべてのコードが完全にインデントされていることがわかった場合は、別のエディターで開いてみてください。インデントされていないコード行が表示されます。
vim、gedit、またはそのようなエディターを使用したときに、それは私に起こりました。
コードには1つのエディターのみを使用するようにしてください。
スクリプトをコピーして、「」の下にコード全体を配置するだけです「」...
この行を変数で指定します..のように、
a = """ your python script """
print a.replace('here please press tab button it will insert some space"," here simply press space bar four times")
# here we replacing tab space by four char space as per pep 8 style guide..
Sublime Editor で ctrl+b を使用してこのコードを実行すると、インデントされたコードがコンソールに出力されます。それでおしまい
インデントに問題がないように見える場合は、エディタに「空白を表示」オプションがあるかどうかを確認してください。これを有効にすると、スペースとタブが混在している場所を見つけることができます。
Notepad++ は正しいタブ スペースを提供していましたが、最終的に Sublime テキスト エディターでインデントの問題が見つかりました。
Sublime テキスト エディターを使用して、1 行ずつ移動します