Pythonの「予期しないインデント」をどうするか?


117

Pythonの「予期しないインデント」エラーを修正するにはどうすればよいですか?


4
エラーを生成するコードフラグメントは、問題をよりよく理解するのに役立ちます。質問を編集してコードを含めてください。
RBerteig 2009年

7
これは空白の問題のように思えるので、コードサンプルは役に立たないでしょう。
ジェームズマクマホン

曖昧な質問と回答なし。
rafael.js 2012年

「エラーを修正するには...」発生場所を特定し、エラーの原因を修正します。この場合、その特定の行のインデントをPythonが期待しているもののように見せることで...
twalberg

回答:


132

Pythonは、行の先頭の間隔を使用して、コードブロックの開始と終了を決定します。取得できるエラーは次のとおりです。

予期しないインデント。このコード行の先頭には前よりも多くのスペースがありますが、前の1つはサブブロックの開始ではありません(たとえば、if / while / forステートメント)。ブロック内のすべてのコード行は、まったく同じ空白文字列で始まる必要があります。例えば:

>>> def a():
...   print "foo"
...     print "bar"
IndentationError: unexpected indent

これは、Pythonをインタラクティブに実行する場合に特に一般的です。コマンドの前に余分なスペースを入れないでください。(サンプルコードをコピーして貼り付けると非常に煩わしい!)

>>>   print "hello"
IndentationError: unexpected indent

インデント解除は、外側のインデントレベルと一致しません。このコード行の最初のスペースは前のものよりも少ないですが、同様に、それが含まれる可能性のある他のどのブロックとも一致しません。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」コマンドパスを使用します。

>>> def foo():
...     pass

タブとスペースの混在は許可されていますが(少なくとも私のバージョンのPythonでは)、Pythonはタブが8文字であることを想定しているため、エディターと一致しない場合があります。タブに「いいえ」と言うだけです。ほとんどのエディターでは、スペースで自動的に置き換えることができます。

これらの問題を回避する最良の方法は、サブブロックをインデントするときに常に一定数のスペースを使用することであり、理想的には問題を解決する優れたIDEを使用することです。これにより、コードが読みやすくなります。


7
良い説明。それ以外に、メモ帳++でスペースと「タブ」および「スペースバー」を混在させたときに、「インデントの予期しないエラー」をインデントしました。「タブ」を「スペース」に置き換えて修正しました。
ホセ・ロサスサエンス

2
@JoséRosasSáenzあなたのコメントは私にとてもトラブルを救いました
user3726345 '19

もう1つの原因はexcepttry条項の一部を逃していることです。コードは正しく見えますが(インデントされていない行はtryブロックの外にあることを意味します)、Pythonはこれを「予期しないインデント」エラーとして報告します。これを修正するにはexcept、おそらくpassここのよう)を使用します
dumbledad

@dumbledadどのバージョンのpythonが表示されますか?私(2.7.15と3.6.8の両方)を試してみると、SyntaxError
Alice Purcell

Webサイトからコードをコピー/貼り付けしたときに、このエラーが発生しました。配置は問題ないように見えましたが、QGIS(3.10)がコードを実行する前に、空白を削除し、スペースを使用して再適用する必要がありました。
benj

23

Pythonでは、間隔が非常に重要です。これにより、コードブロックの構造が決まります。このエラーは、次のようにコード構造をめちゃくちゃにすると発生します。

def test_function() :
   if 5 > 3 :
   print "hello"

ファイル内にタブとスペースが混在している場合もあります。

PyScripterNetbeansなどのpython構文認識エディタを使用することをお勧めします


1
はい、間違いなくpython対応のエディタを使用してください!デフォルト設定でnotepad ++で編集しているときに問題が発生し、空白が間違っていました
Dave Archer

2
タブとスペースが混在すると、「SyntaxError:一貫性のないインデントでのタブとスペースの使用」が発生する
SilentGhost

ヘッドアップのように、Python Netbeansプラグインは現在、タブを既存のコードからスペースに変換しません。ただし、新しいコードを作成するときにそれを行います。
James McMahon、

PyCharmはそれを一貫して変換できます。また、「障害」の行を強調表示します。これは1960年代ではないため、引用符を使用しています。Pythonなどの素晴らしい言語には、このように頭の痛い、時間を浪費する欠陥があるとは信じられません。
エシェロン

私はコードを書いている途中で意図せずにエディターを切り替えましたが、新しいコードのインデントが詰まりました。変更は目に見えませんでしたが、インタープリターは私のコードを実行しませんでした。この投稿は問題の発見に役立ちました。
Lucien Stals 2015年

21

-ttオプションを指定してコードを実行し、タブとスペースの使用に一貫性がないかどうかを確認します


16

使用しているエディタで空白の表示をオンにし、タブをスペースに置き換えるをオンにします。

Pythonでタブとスペースを組み合わせてタブを使用することはできますが、通常は発生しているエラーが発生します。4つのスペースでタブを置き換えることは、Pythonコードを書くための推奨アプローチです。


1
具体的にどのようにこれを行いますか?私はSublimeを使用しています。
チボレ2017

8

正しいインデントを使用する。Pythonは空白を認識するため、ブロックのインデントガイドラインに従う必要があります。そうしないと、インデントエラーが発生します。


6

Sublimeを使用してPythonを記述していて、インデントエラーが発生している場合は、

表示->インデント->インデントをスペースに変換

私が説明している問題は、Sublimeテキストエディタが原因です。同じ問題が他の編集者によっても引き起こされる可能性があります。基本的に、この問題は、スペースの観点からインデントを処理したいPythonと、タブの観点からインデントをコーディングするさまざまなエディターとの関係に関係しています。


ああ...それで崇高はこれを引き起こしていますか?
nitin 2017

はい、私が説明している問題はSublimeが原因です。他の編集者が原因である可能性もあります。基本的に、この問題は、スペースの観点からインデントを処理したいPythonと、タブの観点からインデントをコーディングするさまざまなエディターとの関係に関係しています。
Puneet Lamba

notepad ++でも同じ問題が発生しました。何が本当の目に会ったので、これをクラックするのにしばらくかかりました。私はエディタは、タブにいくつかの空白を変換していた把握する時にカーソルを1つの文字を移動しなければならなかった
バーラトアナンド

4

エディタでオプション「タブの代わりにスペースを挿入する」を使用していることを確認してください。次に、たとえば4のタブ幅を選択できます。これらのオプションは、geditの[編集]-> [設定]-> [エディター]にあります。

要点:タブではなくスペースを使用


あなたの一番下の行はトリックをしました!
Nick Div

3

このエラーは、何かをPythonインタープリター(ターミナル/コンソール)に貼り付けるときにも発生する可能性があります。

インタプリタは空行を式の終わりとして解釈することに注意してください。

def my_function():
    x = 3

    y = 7

インタプリタは、前の空の行をy = 7式の終わり、つまり関数の定義が完了したことを解釈します。次の行y = 7は、新しい式であるため、インデントが正しくありません。


関数定義内の空白行は罰金であることが重要なビーイングが、 Pythonは関数の最後として、任意の空白行を解釈するので、彼らはまだ初期の空白を持っている必要があります
MichaelChirico

3

言及されていないように見える1つの問題は、インデントとは何の関係もないコードの問題が原因でこのエラーが発生する可能性があることです。

たとえば、次のスクリプトを見てください。

def add_one(x):
    try:
        return x + 1
add_one(5)

これはIndentationError: unexpected unindentもちろん問題がexcept:ステートメントの欠落である場合にを返します。

私のポイント:予期しない(非)インデントが報告されている上記のコードを確認してください!


2

インデントが問題ない場合は、エディタに「空白の表示」オプションがあるかどうかを確認してください。これを有効にすると、スペースとタブが混在している場所を見つけることができます。


2

常に私のために働いたトリックがあります:

予期しないインデントが発生し、すべてのコードが完全にインデントされている場合は、別のエディターで開いてみてください。インデントされていないコード行が表示されます。

それは、vim、gedit、またはそのようなエディターを使用したときに起こりました。

コードには1つのエディターのみを使用してください。


2

単にあなたのスクリプトをコピーして、 "" "の下にあなたのコード全体を挿入してください" "" ...

この行を変数で指定します。

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..

ctrl + bを使用してSublimeエディターでこのコードを実行すると、インデントされたコードがコンソールに出力されます。それでおしまい


コードをどのように実行しますか?"" "と" ""と印刷物を削除して、通常どおりに実行する必要がありますか?
チボレ2017

"" "" ""(三重引用符)は、文字列ではなくコンテンツを参照しません。これは、コードに一重/二重引用符の文字列が含まれている可能性があるため必須です。 "" "が必要です
Mohideen bin Mohammed

2

次のコードの先頭からスペースまたはタブスペースを削除するだけです

from django.contrib import admin

# Register your models here.
from .models import Myapp
admin.site.register(Myapp)

2

次のコマンドを実行して解決します。

autopep8 -i <filename>.py

これによりコードが更新され、すべてのインデントエラーが解決されます:)

これが解決することを願っています


実装は非常に簡単です。いつも私のために働くので、私が共有したことが誰かにとって有益になると期待しています:)
Sharyar Vohra

1

Notepad ++はタブスペースを正しく設定していましたが、インデントの問題がSublimeテキストエディタでようやく見つかりました。

Sublimeテキストエディターを使用して行ごとに移動


0

Pythonのインデントは重要であり、他の多くのプログラミング言語とは異なり、これは単にコードを読みやすくするためではありません。連続するコマンドの間にコード内に空白またはタブがある場合、Pythonはこれに敏感であるため、Pythonはこのエラーを出します。コードをコピーして任意のPythonに貼り付けると、このエラーが発生する可能性があります。 Notepad ++などのテキストエディタを使用してこれらのスペースを識別して削除するか、エラーが発生しているコード行から手動で空白を削除してください。

Step1 :Gives error 
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])

Step2: L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]print(L[2: ])

Step3: No error after space was removed
L = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
print(L[2: ])
OUTPUT: [[7, 8, 9, 10]]

ありがとう!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.