Ответ 1
Возможно, у вас есть смешанные вкладки и пробелы в вашем файле. Вы можете иметь возможность проверки python для таких ошибок с помощью
python -m tabnanny <name of python file>
Я просто не могу понять, что с этим не так...
#!/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 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>
Вероятно, у вас есть смесь пробелов и вкладок в исходном исходном файле. Замените все вкладки четырьмя пробелами (или наоборот), и вы сразу увидите проблему.
В вашем коде, вставленном в ваш вопрос, нет этой проблемы, но я думаю, что ваш редактор (или ваш веб-браузер, или сам переполнение стека...) мог бы сделать преобразование вкладок в пространство без вашего ведома.
Не забывайте использовать комментарии "". Они нуждаются в точном отступе (для меня тоже требуется 1/2 часа работы!)
Я использую базовую версию gedit, которая поставляется с Ubuntu 11.10. У меня была такая же ошибка. Это происходит главным образом при смешивании пробелов с вкладками.
Хороший способ отличить, к каким линиям будет проблема, - это перейти к: 1. изменить 2. предпочтения 3. редактор 4. отметьте "автоматический отступ" 5. увеличьте отступ до 12 или некоторое большое число
после выполнения пятого шага вы сможете увидеть строки вашего кода, которые могут вызвать проблемы (это строки, в которых есть пробел и вкладка)
Сделать все условное соглашение как только TAB или просто SPACE (это нужно делать вручную по строкам)
Надеюсь, что это поможет...
Может быть, эта часть:
if speed > self.buginfo["maxspeed"]: self.buginfo["maxspeed"] = speed
if generation > self.buginfo["maxgen"] : self.buginfo["maxgen"] = generation
Попробуйте удалить дополнительное пространство, чтобы он выглядел совпадающим.
Изменить: из pep8
Yes: x = 1 y = 2 long_variable = 3 No: x = 1 y = 2 long_variable = 3
Попробуйте следовать этому стилю кодирования.
Я бы рекомендовал проверять уровни отступов на всем протяжении. Убедитесь, что вы используете все вкладки полностью или полностью, без смешивания. В прошлом у меня были проблемы с четными отступами, которые были вызваны смесью.
Извините, я не могу добавлять комментарии, так как моя репутация недостаточно высока: -/, поэтому это должен быть ответ.
Как уже отмечалось несколько человек, код, который вы опубликовали, содержит несколько (5) синтаксических ошибок (дважды = вместо == и три: отсутствует).
После исправления синтаксических ошибок у меня нет никаких проблем, будь то отступы или иначе; конечно, невозможно увидеть, были ли у вас смешанные вкладки и пробелы, как это предлагал кто-то другой, что, вероятно, является вашей проблемой.
Но реальная точка, которую я хотел подчеркнуть, заключается в следующем: tabnanny IS NOT REALIABLE: вы можете получить ошибку "отступа", если на самом деле это просто синтаксическая ошибка.
Eg. Я получил его, когда я добавил одну закрытую круглую скобку больше, чем необходимо; -)
i += [func(a, b, [c] if True else None))]
вызовет предупреждение из tabnanny для следующей строки.
Надеюсь, это поможет!
Geany имеет в своем меню опцию, в которой говорится: "Применить намерение по умолчанию", которое заменяет вкладки на количество пробелов, если указано в настройках Geany.
ИДЕТ ДЛЯ ВИЗУАЛЬНЫХ ПОЛЬЗОВАТЕЛЕЙ СТУДИО: Я столкнулся с этой проблемой и при перемещении кода непосредственно из IDLE в Visual Studio. Когда вы нажимаете вкладку, IDLE добавляет 4 пробела вместо вкладки. В IDLE нажмите Ctl + A, чтобы выбрать весь код и перейдите в раздел Формат > Табизация. Теперь переместите код в визуальную студию, и большинство ошибок должно быть исправлено. Каждый так часто будет код, который находится вне поля вкладки, просто исправьте его вручную.
У меня была аналогичная проблема с IndentationError в PyCharm.
Я не смог найти никаких вкладок в моем коде, но как только я удалил код ПОСЛЕ линии с IndentationError, все было хорошо.
Я подозреваю, что у вас есть вкладка в следующей строке:
sex = sex if not sex == 2 else random.randint(0,1)
У меня была такая же проблема, и она не имела ничего общего с вкладками. Это был мой проблемный код:
def genericFunction(variable):
for line in variable:
line = variable
if variable != None:
return variable
Обратите внимание, что выше for
имеет отступы с большим количеством пробелов, чем строка, начинающаяся с if
. Это плохо. Все ваши отступы должны быть последовательными. Поэтому, я думаю, вы могли бы сказать, что у меня было странное пространство, а не бродячая вкладка.