web-dev-qa-db-ja.com

Pythonスクリプトを実行しようとすると、「予期されたインデントされたブロック」が表示されるのはなぜですか?

「インデントされたブロックが予想されます」というエラーがあります。このエラーの処理方法を教えてください。ありがとうございました:)

コード例:

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch) 
6
boddhisattva

おそらく、タブとスペースを混在させています。 見た目インデントされていますが、実際にはそうではありません。


あなたのコードは私に別のエラーを与えます:

_for ch in f:                                                  \
  ( translatedToken = english_hindi_dict[ch] )                \
    if (ch in english_hindi_dict) else (translatedToken = ch)
                                                        ↑

SyntaxError: invalid syntax
_

多分あなたは意味しました:

_for ch in f:
  if ch in english_hindi_dict:
    translatedToken = english_hindi_dict[ch]
  else:
    translatedToken = ch
_

多分あなたは代わりに意味しました:

_for ch in f:
  translatedToken = english_hindi_dict[ch] if ch in english_hindi_dict else ch
_

どちらも問題なく動作するはずで、2番目は前者よりも速いと思います

どちらもtranslated = str(english_hindi_dict.get(ch, ch) for ch in f)に最適化できますが、それは問題のポイントではありません。

13
badp

コード例に一致するように回答を編集します。

for ch in f: ( translatedToken = english_hindi_dict[ch] ) if (ch in english_hindi_dict) else (translatedToken = ch)  

有効なPythonではありません。

まず、読みやすさのカウント。コードは読みにくいため、デバッグも困難です。 「ch」と「f」とは何ですか?さらに、Pythonで1つのライナーを実行できますが、お勧めしません。そのため、forを別の行に配置してからインデントします。

for chunk in file: 
    ( translatedToken = english_hindi_dict[chunk] ) if (chunk in english_hindi_dict) else (translatedToken = chunk)

これで、何が問題なのかがわかります。条件文で変数の割り当てを行います。これはPythonでは許可されていません。あなたはC/C++のバックグラウンドを持っていて、それを行うのに慣れていると思います。 Pythonでは、難読化されたコードを記述できないようにすることはできません。したがって、次のようになります。

for chunk in file: 
    translatedToken = english_hindi_dict[chunk] if chunk in english_hindi_dict else chunk

Python 2.5+を使用すれば、このコードは機能するはずです。ただし、古いPythonバージョンでは、三項演算子はまだ使用できません。少し作りましょう。フレンドリー:

for chunk in file: 
    translatedToken = chunk
    if chunk in english_hindi_dict:
        translatedToken = english_hindi_dict[chunk]

あなたは書くのが長いと主張するかもしれません、そしてあなたは正しいでしょう。ただし、コードを書くよりも読むことに多くの時間を費やすため、読みやすくすることは理にかなっています。またはもちろん、Pythonグリップを取得したら、よりPythonの方法で機能させるようにします。EAFTPについて聞いたことがありますか?

for chunk in file: 
    try:
        translatedToken = english_hindi_dict[chunk]
    except KeyError:
        translatedToken = chunk

しかし、Pythonは驚きに満ちており、これらの古典的な使用例のほとんどはすでに処理されていることがわかります。標準ライブラリは、多くの場合、エレガントで短くて読みやすいソリューションを提供します。

for chunk in file: 
    translatedToken = english_hindi_dict.get(chunk, chunk)

結論として:Cを書いたようにPython、またはJava。他のツール、他のスタイル。


この問題を修正するには、エディターの「検索と置換」機能を起動し、巨大な「すべて置換」を実行して、すべてのタブを4スペース、またはその逆に変更します。次に、すべてのブロックをインデントし、最後にすべての命令を同じブロックに揃えます。

以前はSOに登場しなかった面白い。結局のところ、それはそれほど明白ではないのは事実です。

Pythonでは、「{」ではなく、スペースまたはタブを使用してブロックを区切ります。

したがって、ブロック(関数、ループ、クラスなど)を下るときはいつでも、コードをインデントする必要があります。これは単なる良い習慣ではなく、必須です。そうしないと、プログラムがクラッシュします。

現在、ほとんどの場合、インデントを行ったがタブとスペースを使用したため、このエラーが発生します。 Pythonプログラムでは、タブまたはスペースのいずれかを使用する必要がありますが、同じファイルで両方を使用することはできません。

例えば:

if (age > 18)
{
    printf("You can vote")
}

になる:

if age > 18:
    print("You can vote")

ほとんどの言語では、次のことができます。

if (age > 18)
{
printf("You can vote")
}

Pythonではできません:

if age > 18:
print("You can vote")

例外が発生します。さらに、同じブロックのすべての命令を整列させる必要があるため、次のようになります。

if age > 18:
    print("You can vote")
    print("How cool is that ?")

大丈夫ですが:

if age > 18:
    print("You can vote")
   print("How cool is that ?")

例外が発生します。

最終的に、同じブロック内でタブとスペースを混在させることはできません。そう:

if age > 18:
    print("You can vote")
    print("How cool is that ?")

見た目は良いですが、例外が発生します。この問題を回避するには、タブまたはスペースに固執するだけです。 PEP8 、コーディングスタイルのリファレンスとして最もよく使用されるテキストは、4つのスペースを使用することをお勧めします。

ほとんどのエディターには、グローバルな「検索と置換」機能があり、問題を修正できます。 Geanyや lipad のようなものには、「すべてのタブをスペースに置き換える」機能さえあります。

13
e-satis

Pythonは、Cや、この目的で中括弧を使用する他のいくつかの言語とは異なり、プログラム構造を決定するためにインデントに大きく依存する言語です。

次のようなステートメントがある場合:

if true:
pass

ifのインデントされたステートメントがないため、文句を言います。次のように修正する必要があります。

if true:
    pass

実際のコードを投稿した方が明らかだったかもしれませんが、それはあなたが持っている一種のエラーのように聞こえます。問題を述べるときは、コードを提供し、予想される動作とは何か、そしてそれが実際の動作にどのように関連しているかを説明することをお勧めします。あなたはあなたを助けようとしている人々の生活をはるかに簡単にするでしょう:-)

また、コードが正しく見えても、この問題が発生する可能性があることにも注意してください。ソースコード内でスペースとタブを混在させると、多くの場合、これが発生する可能性があります。

11
paxdiablo

IndentationErrorsは、さまざまな原因で発生する可能性があります。頭のてっぺんから:

  • インデントをまったく忘れています。

    Pythonは、インデントを使用して構文ブロックを区切ります。例えば:

    if will_is_awesome:
        print "You're right"
    else:
        print "You lie!"
    

    インデントを忘れると、IndentationError: expected an indented blockエラーが発生します。例えば:

    if will_is_awesome:
    print "You're right"
    else:
    print "You lie!"
    
  • インデントされたブロックをコメントアウトします。

    例えば:

    if light_is_green:
        go_now()
    else:
        # go_anyway()
    do_something_else()
    

    これにより、IndentationError: expected an indented blockが生成されます。これは、コメントによってelse:の後の行がパーサーにとって空に見えるためです。 passステートメントを追加すると、問題が修正されます。例えば:

    if light_is_green:
        go_now()
    else:
        # go_anyway()
        pass
    do_something_else()
    
  • インデント内のタブとスペースの混合。

    タブストップは、マシンやエディターによって異なります。タブとスペースを適切に組み合わせると、エラーが発生する可能性がありますが、通常はIndentationError: unindent does not match any outer indentation levelが生成されるため、問題になる可能性はほとんどありません。とにかく知っておく価値があります。 決して Pythonコードでタブを使用することをお勧めします。

3
Will Harris

Pythonは、インデント(コード行の前のスペース/タブ)を使用して、コードのブロックが開始および終了する場所を、その前のpythonステートメントと比較して示します。

したがって、PHPの例:

if ($blah == 'foo')
{
  // this is line 1 of my code block
  // this is line 2
}

Pythonでは、次のようになります。

if blah == 'foo':
    # this is line 1 of my code block
    # this is line 2
    pass

正確なエラーと一緒に、いくつかのコードを提供していただけますか?

2
Lior Cohen

Pythonは、文字ではなくインデントによってブロックを決定します{および} C/C++/Java/PHP/...のように、または他のいくつかの言語で見られるif/endifまたはbegin/endペアによって。したがって、インデントに注意する必要があります。タブとスペースを混在させることも適切ではありません。

1
Messa