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


584

以下の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

どうして?


7
計算に「n」を含めたい場合は、おそらくrange(1、n + 1)の方が良いでしょう:-)
Abgan

7
同じエラーが発生しましたが、コード内で少し左にメソッドをインデントしてしまったため、次のメソッドの最後にこのエラーが発生しました。したがって、このエラーはタブとスペースの混合だけで発生するわけではありません。
ファルケン教授の契約が2012年

14
私はSublime Text 3を使用しています。Djangoプロジェクトがあります。使用してエラーを修正しましたView > Indentation > Intent Using Spaces
AbhimanyuAryan 2016年

pycharmでこの問題が発生したため、設定でタブと間隔を調整しても機能しませんでした。問題は、pycharm構成を上書きする〜/ .editorconfigファイルがあったことです。
ケンマイヤーズ

IDLEを使用すると、インデントの問題を見つけやすくなります。ほとんどの編集者が見つけられないインデントエラーを明確に見つけるでしょう。
Dennis Gathagu

回答:


668

他のポスターはおそらく正しいでしょう...タブにスペースが混在している可能性があります。検索と置換を行って、すべてのタブをいくつかのスペースに置き換えてみてください。

これを試して:

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)

2
ええ、私は最後の2行で内部ループ部分の上に本当にスペースを置かなければなりませんでした(SOのみ)。理由がわからない...
cbrulak 2009年

3
(1きahve必要があり、修正するためのおかげで)私の最初のライン、「結果= 0」は、残りはタブ付きしている間に間隔を置いて配置された、くそ、Pythonはそのようなものだった知らなかった
cbrulak

1
ええ、それはトリッキーになる可能性があります。私はemacsを使用してpythonを編集していますが、pyファイルのタブを常にスペースで置き換えるように設定しているため、この問題は発生しません。Notepad ++にもこのようなオプションがある場合があります。
ケビンタイグ

3
同じ問題atm :)を得た。SublimeTextはスペースをドットとして表示します。これはかなり便利です。
クリス

そのため、スペースまたはタブでインデントすることができます。あなたはちょうど良心的である必要がありますか?前髪
デビッド

265

重要スペースが推奨される方法です -PEP008 インデントタブまたはスペースを参照してください。(@Sihaに感謝します。)

以下のためのSublime Textユーザー:

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

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


1
パイソンを使用したときにも、あなたはあなたが使用してどのIDE /テキストエディタで同様のオプションを設定します
activatedgeek

20
また、ATOMでは、[パッケージ]> [ホワイトスペース]> [スペースをタブに変換]を選択すると、Pythonの構文エラーによる頭痛の種を回避できます。
loretoparisi 2015年

1
スペースが推奨される方法です -PEP008 インデントタブまたはスペースを参照してください。Sublimeは、このように設定することもできます。
SiHa

13
あなたはスペースが好ましい方法であると言いますが、あなたの答えは人々に代わりにタブを使うように崇高に頼むように求めます!私は混乱しています
下駄2016

@NunoCalaim残念ながら、それは私が質問に答えた後に起こりました。新しいプロジェクトを開始する場合は、推奨されるスペースの手法を使用してください。だからこそ、私が太字で編集して、初心者が免責事項を認識できるようにしました。
activatedgeek

137

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

python -m tabnanny yourfile.py

もちろん、エディタを正しく設定することもできます:-)


1
いくつかのタブ/スペースインデントエラーのあるファイルでこれを試しましたが、正しくないタブファイルでは出力がまったくありません。何か案が?
Luchux 2012年

1
スペースに問題があり、エラーはそれが191行目にあると述べましたが、tabnannyのおかげで、実際の問題はその行ではなく、上の行にあることがわかりました。
richar8086

ありがとうございました!すばらしいヒントです。エラーはVS Codeのflake8によって識別されました、問題がどこにあるのか識別できませんでした-タブナニーはマイクロ秒で行いました。
Steve

39

インデントの空白にタブとスペースを混在させていませんか?(それがそのエラーの原因になります。)

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


よくわかりません。上記の答えは、スペースではなくタブを使用するようにテキストエディターオプションを切り替えることを示しています。
スパー

3
@BananaCodeタブまたはスペースのみを使用する限り、技術的にどちらを選択してもかまいません。Pythonではスペースが推奨されますが、私が参照したリンクを参照してください。
zdan、2015年

21

このエラーが発生したときはいつでも、エディタでタブとスペースがどういうわけか混同しているためです。


13

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

1)すべてを選択(例:Ctrl+)A

2)フォーマットに行く->領域のタブを外す

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

Python 2.5.4を使用しています


9

Vimを使用している場合は、Escキーを押してから次のように入力します

gg = G

この自動はすべてをインデントし、投入したスペースをすべてクリアします。


8

行:result = result * iインデントする必要があります(forループの本体です)。

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


奇妙なことに、私は編集をSOで変更しなければなりませんでした。質問の私の更新された「編集」ノートを参照してください
cbrulak '29年

わかりましたので、私の答えの2行目は正しいと思います-スペースとタブ文字が混在しています(それぞれASCIIで32と8)
Abgan

5

オンアトム

に行く

Packages > Whitespace > Convert Spaces to Tabs

次に、ファイルのインデントをもう一度確認します。

python -m tabnanny yourFile.py

または

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

4

インデントの問題のようです。Pythonでは中括弧を一致させる必要はありませんが、インデントレベルを一致させる必要あります。

スペース/タブの問題を防ぐ最善の方法は、テキストエディター内に非表示の文字を表示することです。これにより、インデント関連のエラーをすばやく回避または解決できます。

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


4

notepad ++を使用する場合は、拡張検索モードで「置換」を実行して\ tを検索し、4つのスペースで置換します。


2

Atomユーザーの場合、Packages ->whitspace -> remove trailing whitespaces これは私にとってうまくいきました


2

単なる追加。Notepad ++の両方のインデントで同様の問題がありました。

  1. 例外のないインデント
  2. 外部インデントレベル

    ---->検索タブに移動します----> 置換をタップします----> ラジオボタンを押します下に拡張 ---> \ tを4つのスペースに置き換えます

    ---->検索タブに移動します----> 置換をタップします----> ラジオボタンを押します下に拡張 --->今すぐ\ nを何も置換しません


2

私はJupyter Notebookを使用していて、上記のソリューションのほとんどすべて(私のシナリオに適応)を試しても役に立たなかった。次に、1行ずつ進み、各行のすべてのスペースを削除して、タブに置き換えました。それで問題は解決しました。



1

上の関数が同じ方法でインデントされていないことが原因である可能性があります。すなわち

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

1

私は昨日同じ問題を抱えていました、それはインデントエラーであり、崇高なテキストエディタを使用していました。修正に何時間も費やしましたが、最終的にコードをVIテキストエディターにコピーしてしまい、問題なく動作しました。ps pythonは余白に敏感すぎるため、スペースとタブを混在させないようにしてください。


1

私はへの回答特定はありません実現しているので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

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

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

いずれにせよ、それが空の関数である理由を明確に してください-あなた自身のために、またはあなたのコードを使用するあなたの仲間のために


パスステートメントがあり有用である可能性:)
KevinG

1

最初に、論理エラーがあることを思い出させるために、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

その価値のために、私のdocstringはインデントされすぎており、これも同じエラーをスローします

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

IndentationError: unindent does not match any outer indentation level


これで私の問題が修正されました
bhordupur

0

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

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

#!/usr/bin/python -tt

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



0

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

1)すべてを選択(例:Ctrl + A)

2)コードに移動->領域のタブを解除

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

Python 3.4.2を使用しています


0

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

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

0

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


0

ために SPYDERのユーザー:私のpython 3.7.1と3.3.2スパイダーを使用していると私はこれを解決し、使用のタブにインデントを設定するには、以下の手順で、をクリックしてください:

  • ツール。
  • 環境設定。
  • 編集者。
  • 高度な設定。
  • インデント文字->タブ。

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

何らかの理由で、この設定がないと、ゴースト IndentationErrorが発生することがあります。


0

例えば:

1. def convert_distance(miles):
2.   km = miles * 1.6
3.   return km

このコードでは、同じ状況が発生しました。2行目と3行目の以前のインデントスペースを削除してから、タブかスペースを使用します。両方を使用しないでください。Pythonでコードを記述する際は、適切なインデントを設定してください。Spyderの場合は、[ソース]> [インデントを修正]に移動します。同じことがVCコードと崇高なテキストや他のエディタにも当てはまります。インデントを修正します。


-6

これは主にエディターが原因で発生します。タブをスペースに変更してみてください(4)。Pythonに最適なIDEまたはエディターは、pycharm、sublime、vim for Linuxです。
私も同じ問題に遭遇しましたが、後でエンコーディングの問題があることがわかりました。

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