web-dev-qa-db-ja.com

IndentationError:unindentは外側のインデントレベルと一致しません

以下のPythonコードをコンパイルすると、

IndentationError:unindentは外側のインデントレベルと一致しません


import sys

def Factorial(n): # Return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

どうして?

469
cbrulak

他のポスターはおそらく正しいです...あなたのタブと混在するスペースがあるかもしれません。検索と置換を実行して、すべてのタブを数個のスペースで置き換えます。

これを試して:

import sys

def Factorial(n): # return factorial
    result = 1
    for i in range (1,n):
        result = result * i
    print "factorial is ",result
    return result

print Factorial(10)
541
Kevin Tighe

_ important _ スペースは好ましい方法です - PEP008を参照してください インデント および タブまたはスペース? 。 (@Sihaさん、ありがとうございます。)

Sublime Textユーザーの場合:

インデントにタブを使用するようにSublime Textを設定します。View - > Indentation - > Convert Indentation to Tabs

上記と同じサブメニューでIndent Using Spacesオプションをオフにします。これはすぐにこの問題を解決します。

219
activatedgeek

タブやスペースの問題を簡単にチェックするには、実際にこれを行うことができます。

python -m tabnanny yourfile.py

またはもちろん、エディタを正しく設定することもできます。

123
André

インデントの空白にタブとスペースを混在させていませんか。 (それはそのエラーを引き起こします。)

Pythonコードではタブを使用しないことをお勧めします。 スタイルガイド を参照してください。タブ用のスペースを挿入するようにNotepad ++を設定する必要があります。

35
zdan

私がこのエラーに遭遇したときはいつでも、私はどうにか私のエディタでタブとスペースを混同したからです。

16
Dana

PythonのIDLEエディタを使用している場合は、同様のエラーメッセージで示唆されているように実行できます。

1)すべて選択Ctrl + A

2)フォーマットに移動 - >地域を確定しない

3)インデントがまだ正しいことを再確認し、保存してプログラムを再実行します。

私はPython 2.5.4を使っています

9
Gatica

result = result * iはインデントする必要があります(for-loopの本体です)。

または - スペースとタブ文字が混在している

8
Abgan

もしあなたがVimを使っているなら、escapeを押してからタイプする。

gg = G

この自動はすべてをインデントし、あなたが投げ込んだスペースを一掃します。

7
cbartondock

Notepad ++を使用している場合は、\ tを検索して4つのスペースで置き換えるために、拡張検索モードで "replace"を実行してください。

4
Jackie Lee

オン 原子

に行く

Packages > Whitespace > Convert Spaces to Tabs

その後、ファイルのインデントをもう一度確認してください。

python -m tabnanny yourFile.py

または

>python
>>> help("yourFile.py")
4
loretoparisi

インデントの問題に見えます。 Pythonでは波括弧と一致させる必要はありませんが、 do はインデントレベルと一致させる必要があります。

スペースやタブの問題を防ぐ最善の方法は、テキストエディタ内に目に見えない文字を表示することです。これにより、インデント関連のエラーを簡単に防止または解決することができます。

また、コピーペーストされたコードを挿入することは、この種の問題の一般的な原因です。

4
Matt Kahl

atomユーザーのために、Packages ->whitspace -> remove trailing whitespacesこれは私のために働きました

2
Aha

まず最初に、論理エラーがあることを思い出させるために、result = 1を維持することをお勧めします。そうしないと、ループが実行された後も出力はresult = 0になります。

次に、このように書くことができます。

import sys

def Factorial(n): # Return factorial
  result = 0
  for i in range (1,n):
     result = result * i

  print "factorial is ",result
  return result

行を残すと、PythonシェルにFORステートメントが終了したことがわかります。あなたがPythonシェルを使った経験があるなら、あなたは私たちがなぜ行を去らなければならないかを理解することができます。

1

ちょっと追加。私はNotepad ++の両方のインデントについて同様の問題を抱えていました。

  1. 予期しないインデント
  2. 外側インデントレベル

    ---->検索タブ---->をタップ 置換 ---->ラジオボタンを押す 拡張 下--->\tを4つのスペースに置き換えてください。

    ---->検索タブ---->タップ/ 置換 ---->ラジオボタンを押します 拡張 下--->\nを何も置き換えないでください

1
JumpMan

関数を定義しましたが、その関数のコメントとは別に、 コンテンツがありませんでした ...

def foo(bar):
    # Some awesome temporary comment.
    # But there is actually nothing in the function!
    # D'Oh!

それは叫んだ:

  File "foobar.py", line 69

                                ^
IndentationError: expected an indented block

^マークが指す行は空です)

-

複数の解決策:

1:機能をコメントアウトする

2:機能コメントを追加

def foo(bar):
    '' Some awesome comment. This comment could be just one space.''

3:何もしない行を追加する

def foo(bar):
    0

いずれにせよ、 それを明白にすることを忘れないでください なぜ それは空の関数です - あなた自身のために、またはあなたのコードを使うあなたの仲間のため

1
Cedric

spyderに固有の答えがないことに気づいたので、1つ追加します。基本的に、ifステートメントを注意深く見て、すべてのifElif、およびelseは、次のように開始時に同じ行にある同じ間隔を持ちます。

def your_choice(answer):
    if answer>5:
        print("You're overaged")
    Elif answer<=5 and answer>1: 
            print("Welcome to the toddler's club!")
    else:
            print("No worries mate!")
1
NelsonGon

私はJupyterノートブックを使用していて、上記の解決策のほとんどすべてを(私のシナリオに合わせて)試しても意味がありませんでした。私はそれから1行ずつ行き、各行のためのすべてのスペースを削除し、タブと取り替えた。これで問題は解決しました。

1
Cur123

私は昨日同じ問題を抱えていた、それは字下げエラーだった、崇高なテキストエディタを使用していた。修正に時間がかかり、最後にコードをVIテキストエディタにコピーすることになりましたが、うまくいきました。 ps pythonは余白の影響を受けやすいので、スペースとタブを混ぜないでください。

1
user3731311

Pythonの開発にSublimeテキストを使用している場合は、パッケージAnacondaを使用してエラーを回避できます。

  1. あなたのファイルを崇高に開く
  2. オープンスペースを右クリック
  3. アナコンダを選ぶ
  4. オートフォーマットをクリック
  5. 完了またはCtrl + Alt + Rキーを押します。
0
Kapilfreeman

Komodoエディタを使用している場合は、同様のエラーメッセージのいずれかで示唆されているように実行できます。

1)すべて選択Ctrl + A

2)コードに移動 - >地域の統一を解除

3)インデントがまだ正しいことを再確認し、保存してプログラムを再実行します。

私はPython 3.4.2を使っています

0
Imtiaz Pabel

私の場合、問題はEclipseでのpydevの設定でした

pydev @ Eclipse

0
Rui Martins

その価値のために、私のdocstringは過度にインデントされていて、これも同じエラーを投げます

class junk: 
     """docstring is indented too much""" 
    def fun(): return   

IndentationError: unindent does not match any outer indentation level

0
plfrick

SPYDER usersの場合:python 3.7.1でspyder 3.3.2を使用しており、タブを使用するようにインデントを設定し、次の手順でこれを解決しました。 :

  • ツール。
  • プリファレンス。
  • 編集者。
  • 高度な設定。
  • インデント文字->タブ。

次に、タブキーを使用して「不明な」行をリセットします。

何らかの理由で、この設定なしで、ghostIndentationErrorが発生することがありました。

0
Mike

それより上の関数が同じように字下げされていないためかもしれません。すなわち.

class a:
    def blah:
      print("Hello world")
    def blah1:
      print("Hello world")
0
Ali

pythonプラグインを使用したintellijで、Ctrl + Shift + Altを使用してドキュメントを再フォーマットすると、インデント/タブ/スペースの問題が修正されました

0
Rene Ferguson

これは、タブとスペースの両方が混在しているためです。すべてのスペースを削除してタブに置き換えることもできます。

または、これを書いてみてください:

#!/usr/bin/python -tt

コードの先頭にあります。この行はタブとスペースの違いを解決します。

0
Eragon