web-dev-qa-db-ja.com

Python:「インデントエラー:unindentはどの外側のインデントレベルとも一致しません」

私はこれで何が悪いのか分かりません...

#!/usr/bin/env python
#
#       Bugs.py
#       

from __future__ import division

# No Module!
if __name__ != '__main__': 
    print "Bugs.py is not meant to be a module"
    exit()

# App
import pygame, sys, random, math
pygame.init()

# Configuration Vars
conf = {
    "start_energy": 50, 
    "food_energy": 25, 
    "mate_minenergy": 50, 
    "mate_useenergy": 35, 
    "lifespan": 300000
}

class Bugs:
    def __init__(self):
        self.list  = []
        self.timers= {}
        # Names / colors for sexes
        self.sex = ["Male", "Female"]
        self.color = ["#CBCB25", "#A52A2A"]
        # Bug info tracking
        self.bugid = 0
        self.buginfo = {"maxgen":0, "maxspeed":0}

    def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
        sex   = sex   if not sex   == 2 else random.randint(0,1)
        speed = speed if not speed == 0 else random.randint(1,3)
        # Create new bug object
        self.bugs.append(BugObj(sex, speed, generation, bugid, pygame.time.get_ticks, genes))
        # Make sure it has a timer
        if not self.timers[speed]:
            self.timers[speed] = 1
            pygame.time.set_timer(25 + speed, 1000 / speed)
        # Update info tracking variables
        if speed      > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
        if generation > self.buginfo["maxgen"]  : self.buginfo["maxgen"]   = generation
        self.bugid += 1

    def speed_count(self, speed):
        a = 0
        for i in list[:]:
            if i.speed = speed:
                a += 1
        return a

class BugObj:
    def __init__(self, sex, speed, generation, bugid, born, genes):
        global conf
        self.sex        = sex
        self.speed      = speed
        self.generation = generation
        self.id         = bugid
        self.born       = born
        self.genes      = genes
        self.died       = -1
        self.energy     = conf["start_energy"]
        self.target     = "None"

    def update(self):
        global conf
        if self.age() > conf["lifespan"]:
            self.die()
        else:
            f = closest_food()
            m = closest_mate()
            # If there's a potential mate
            if m != 0 and self.energy > conf["mate_minenergy"]:
                if not self.rect.colliderect(m.rect):
                    self.move_toward(m)
                    self.target = "Mate: " + str(m.rect.center)
                else:
                    Bugs.mate(self, m)
                    self.target = "Mate: (Reached)"
            Elif f != 0:
                if not self.rect.colliderect(f.rect):
                    self.move_toward(f)
                    self.target = "Food: " + str(f.rect.center)
                else:
                    self.eat(f)
                    self.target = "Food: (Reached)"
            else:
                self.target = "Resting"
            # Use energy
            self.energy -= 0

    def closest_food(self):
        pass

    def closest_mate(self):
        pass

    def age(self):
        if self.died != -1:
            return pygame.time.get_ticks - self.born
        else:
            return self.died - self.born

    def die(self):
        # Remove self from the list
        Bugs.list.remove(self)
        # Turn off timer
        if not Bugs.speed_count(self.speed):
            Bugs.timers[self.speed] = 0
            pygame.time.timers(25 + self.speed, 0)
        # Bye!
        del self

class Food:
    def __init__(self)
        pass

    def update(self)
        pass

# Update Loop
while 1:
    ev = pygame.event.wait()
    speed = ev.type - 25
    if speed > 24:
        for i in Bugs.list[:]:
            if i.speed = speed
                i.update()
                print "Updating bug #" + str(i.id)
    if speed == 0:
        Food.update()

私は毎回以下を取得します:

  File "Bugs.py" line 53
    def new(self, x=False, y=False, sex=2, speed=0, generation=0, genes=[]):
                                                                           ^
Indentation Error: unindent does not match any outer indentation level
25
Rob

ファイルにタブとスペースが混在している可能性があります。 pythonそのようなエラーのチェックを助けることができます

python -m tabnanny <name of python file>
55
mbarnett

元のソースファイルにスペースとタブが混在している可能性があります。すべてのタブを4つのスペースに置き換える(またはその逆)と、問題がすぐに表示されます。

質問に貼り付けたコードにはこの問題はありませんが、エディター(またはWebブラウザー、またはStack Overflowなど)が、知らないうちにタブからスペースへの変換を行った可能性があります。

6
RichieHindle

"" "コメントの使用も忘れないでください。これらにも正確なインデントが必要です(私にとってこの1/2時間の作業でもこのエラーを解決できます!)。

4
Pete

Ubuntu 11.10に付属のgedit基本バージョンを使用しています。同じエラーが発生しました。これは主にスペースとタブを混在させるときに発生します。

どの行に問題があるかを区別する良い方法は、次の場所に移動することです。1.編集2.設定3.エディター4.「自動インデント」をチェックします

5番目のステップを実行すると、問題の原因となっているコードの行を見ることができます(これらはスペースとタブが混在する行です)

コード全体をTABまたはSPACEとして作成します(これは手動で行ごとに行う必要があります)

お役に立てれば...

2
jomyfrancis19

PyCharmのIndentationErrorでも同様の問題がありました。

コード内にタブは見つかりませんでしたが、IndentationErrorのある行の後でコードを削除すると、すべてうまくいきました。

次の行にタブがあったと思われます:sex = sex if not sex == 2 else random.randint(0,1)

1
IvanD

PyCharmでもこの問題が発生しました。コードメニューに移動し、再フォーマットコードを選択しました。問題はなくなりました。

1
Riv

ビジュアルスタジオユーザーへのアイドル: IDLEからVisual Studioにコードを直接移動するときにも、この問題に遭遇しました。タブを押すと、IDLEはタブの代わりに4つのスペースを追加します。 IDLEで、Ctl + Aを押してすべてのコードを選択し、Format> Tabify Regionに移動します。次に、コードをVisual Studioに移動し、ほとんどのエラーを修正する必要があります。オフタブのコードが頻繁にありますが、手動で修正するだけです。

0
Wlliam

これと同じ問題があり、タブとは何の関係もありませんでした。これは私の問題コードでした:

def genericFunction(variable):

    for line in variable:

       line = variable


   if variable != None:
      return variable

上記のforは、ifで始まる行よりも多くのスペースでインデントされていることに注意してください。これは悪いです。すべてのインデントは一貫している必要があります。だから、私はあなたが私に漂遊スペースではなく、漂遊タブを持っていたと言うことができると思います。

0
Jared

Geanyのメニューには、「デフォルトのインデントを適用」というオプションがあり、ドイツの設定で指定されている場合、タブをスペースの数で置き換えます。

0
oneindelijk

多分それはこの部分です:

if speed      > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
if generation > self.buginfo["maxgen"]  : self.buginfo["maxgen"]   = generation

余分なスペースを削除して、整列して見えるようにしてください。

編集:from pep8

  Yes:

      x = 1
      y = 2
      long_variable = 3

  No:

      x             = 1
      y             = 2
      long_variable = 3

そのコーディングスタイルに従うようにしてください。

0
Loïc Wolff

インデントレベルを最後まで確認することをお勧めします。混在させずに、タブをすべて使用するか、スペースを使用するようにしてください。過去に奇妙なインデントの問題がありましたが、これは混合によって引き起こされました。

0
Wayne Koorts

申し訳ありませんが、評判が十分でないためコメントを追加できません:-/ので、これは答えである必要があります。

いくつかコメントしているように、投稿したコードにはいくつかの構文エラーが含まれています(==の代わりに2回=と3つの ':'がありません)。

構文エラーが修正されると、インデントであろうとなかろうと問題はありません。もちろん、他の誰かが提案したように、タブとスペースが混在しているかどうかを確認することはできません。これはおそらく問題です。

しかし、私が強調したかった本当のポイントは次のとおりです。tabnannyIS NOT REALIABLE:実際には単なる構文エラーであるにもかかわらず、「インデント」エラーが発生する可能性があります。

例えば。必要以上に1つの閉じ括弧を追加したときに得た;-)

i += [func(a, b, [c] if True else None))]

次の行についてtabnannyから警告を引き起こします。

お役に立てれば!

0
Stefano