web-dev-qa-db-ja.com

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

どうすればpythonのエラー「予期しないインデント」を修正することができますか?

102
moni

Pythonは、コードブロックの開始と終了を判断するために行の先頭にスペースを使用します。あなたが得ることができるエラーは以下のとおりです。

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

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

これは、pythonを対話的に実行するときに特に一般的です。コマンドの前に余分なスペースを入れないでください。 (サンプルコードをコピーアンドペーストすると非常に面倒です!)

>>>   print "hello"
IndentationError: unexpected indent

nindentは、外側のインデントレベルとは一致しません。このコード行の先頭のスペースは、前のスペースよりも少なくなりますが、他のブロックの一部とは一致しません。 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文、function定義)。

>>> def foo():
... print "Bar"
IndentationError: expected an indented block

何もしない関数が欲しいなら、 "no-op"コマンドpassを使ってください:

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

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

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

120
Alice Purcell

Pythonでは、スペースは非常に重要です。これはあなたのコードブロックの構造を与えます。このエラーは、たとえば次のようにコード構造を乱すと発生します。

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

ファイル内にタブとスペースを混在させることもできます。

PyScripter 、または Netbeans のようなpython構文対応エディタを使用することをお勧めします。

21
yanjost

タブとスペースを矛盾して使用しているかどうかを調べるには、-ttオプションを指定してコードを実行してください。

17
Manoj I

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

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

14
James McMahon

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

8
workmad3

Sublimeを使ってPythonを書いているときにインデントエラーが発生すると、

表示 - >字下げ - >字下げをスペースに変換

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

6
Puneet Lamba

エディタで「タブの代わりにスペースを挿入する」オプションを使用していることを確認してください。それから、あなたは、例えば4のタブ幅がほしいと思うことを選ぶことができる。あなたはedit - > preferences - > editorの下のgeditでそれらのオプションを見つけることができる。

一番下の行:スペースではなくタブを使用

3
Alex

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

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

def my_function():
    x = 3

    y = 7

インタプリタは、式の終わりとしてy = 7の前の空の行を解釈します。つまり、関数の定義が終わったことを意味します。次の行 - y = 7は、新しい式なので、誤った字下げをします。

3
Zoltán

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

予期せぬインデントが発生し、すべてのコードが完全にインデントされていることがわかった場合は、別のエディタでそれを開くと、インデントされていないコード行がわかります。

Vim、gedit、またはそのようなエディタを使ったとき、私に起こりました。

あなたのコードに1つのエディタだけを使うようにしてください。

2
Jesus Rodriguez

単にあなたのスクリプトをコピーしてあなたの全体のコードの下に置いてください。

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

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

strime Editorでctrl + bを使ってこのコードを実行すると、インデントされたコードがコンソールに表示されます。それでおしまい

インデントが問題ないようなら、あなたの編集者が "View Whitespace"オプションを持っているかどうかを確かめてください。これを有効にすると、スペースとタブが混在する場所を見つけることができるはずです。

1
Kevan

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

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

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

問題がもちろん不足しているIndentationError: unexpected unindentステートメントである場合、これはexcept:を返します。

私のポイント:予期しない(un)インデントが報告されているところで上記のコードをチェックしてください!

1
WMoreland

Notepad ++はタブスペースを正しく与えていました、しかし字下げ問題はついにSublimeテキストエディタで見つかりました。

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

1
HimalayanCoder

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

from Django.contrib import admin

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

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

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

ありがとうございます。

0
ashu Kr