私はこれで何が悪いのか分かりません...
#!/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
ファイルにタブとスペースが混在している可能性があります。 pythonそのようなエラーのチェックを助けることができます
python -m tabnanny <name of python file>
元のソースファイルにスペースとタブが混在している可能性があります。すべてのタブを4つのスペースに置き換える(またはその逆)と、問題がすぐに表示されます。
質問に貼り付けたコードにはこの問題はありませんが、エディター(またはWebブラウザー、またはStack Overflowなど)が、知らないうちにタブからスペースへの変換を行った可能性があります。
"" "コメントの使用も忘れないでください。これらにも正確なインデントが必要です(私にとってこの1/2時間の作業でもこのエラーを解決できます!)。
Ubuntu 11.10に付属のgedit基本バージョンを使用しています。同じエラーが発生しました。これは主にスペースとタブを混在させるときに発生します。
どの行に問題があるかを区別する良い方法は、次の場所に移動することです。1.編集2.設定3.エディター4.「自動インデント」をチェックします
5番目のステップを実行すると、問題の原因となっているコードの行を見ることができます(これらはスペースとタブが混在する行です)
コード全体をTABまたはSPACEとして作成します(これは手動で行ごとに行う必要があります)
お役に立てれば...
PyCharmのIndentationErrorでも同様の問題がありました。
コード内にタブは見つかりませんでしたが、IndentationErrorのある行の後でコードを削除すると、すべてうまくいきました。
次の行にタブがあったと思われます:sex = sex if not sex == 2 else random.randint(0,1)
PyCharmでもこの問題が発生しました。コードメニューに移動し、再フォーマットコードを選択しました。問題はなくなりました。
ビジュアルスタジオユーザーへのアイドル: IDLEからVisual Studioにコードを直接移動するときにも、この問題に遭遇しました。タブを押すと、IDLEはタブの代わりに4つのスペースを追加します。 IDLEで、Ctl + Aを押してすべてのコードを選択し、Format> Tabify Regionに移動します。次に、コードをVisual Studioに移動し、ほとんどのエラーを修正する必要があります。オフタブのコードが頻繁にありますが、手動で修正するだけです。
これと同じ問題があり、タブとは何の関係もありませんでした。これは私の問題コードでした:
def genericFunction(variable):
for line in variable:
line = variable
if variable != None:
return variable
上記のfor
は、if
で始まる行よりも多くのスペースでインデントされていることに注意してください。これは悪いです。すべてのインデントは一貫している必要があります。だから、私はあなたが私に漂遊スペースではなく、漂遊タブを持っていたと言うことができると思います。
Geanyのメニューには、「デフォルトのインデントを適用」というオプションがあり、ドイツの設定で指定されている場合、タブをスペースの数で置き換えます。
多分それはこの部分です:
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
そのコーディングスタイルに従うようにしてください。
インデントレベルを最後まで確認することをお勧めします。混在させずに、タブをすべて使用するか、スペースを使用するようにしてください。過去に奇妙なインデントの問題がありましたが、これは混合によって引き起こされました。
申し訳ありませんが、評判が十分でないためコメントを追加できません:-/ので、これは答えである必要があります。
いくつかコメントしているように、投稿したコードにはいくつかの構文エラーが含まれています(==の代わりに2回=と3つの ':'がありません)。
構文エラーが修正されると、インデントであろうとなかろうと問題はありません。もちろん、他の誰かが提案したように、タブとスペースが混在しているかどうかを確認することはできません。これはおそらく問題です。
しかし、私が強調したかった本当のポイントは次のとおりです。tabnannyIS NOT REALIABLE:実際には単なる構文エラーであるにもかかわらず、「インデント」エラーが発生する可能性があります。
例えば。必要以上に1つの閉じ括弧を追加したときに得た;-)
i += [func(a, b, [c] if True else None))]
次の行についてtabnannyから警告を引き起こします。
お役に立てれば!