IndentationError: неожиданный отступ для web.py

У меня есть этот код в файле app.py

import web

urls = (
  '/hello', 'Index'
)

app = web.application(urls, globals())

render = web.template.render('templates/')

class Index(object):
    def GET(self):
        return render.hello_form()

    def POST(self):
        form = web.input(name="Nobody", greet="Hello")
        greeting = "%s" % (form.menu)
        if greeting == "ct":
            return render.ct(greeting=greeting)
        elif greeting == "vjc":
            return render.vjc(greeting=greeting)
        elif greeting == "sa":
            return render.sa(greeting=greeting)
        elif greeting == "wc":
            return render.wc(greeting=greeting)
        elif greeting == "pt":
            return render.pt(greeting=greeting)
        else:
            return render.s(greeting=greeting)

if __name__ == "__main__":
    app.run()

и когда я запускаю сервер в cmd, я получаю следующую неожиданную ошибку отступа

$ python bin/app.py
  File "bin/app.py", line 18
    if greeting == "ct":
    ^
IndentationError: unexpected indent

Может кто-нибудь сказать мне причину этой ошибки. Я думаю, что проверял отступ несколько раз, и я не вижу никаких проблем с кодом.

Заранее благодарю за помощь!

1 ответ

Решение

Вы смешиваете вкладки и пробелы для отступа. if строка использует вкладки, но в предыдущей строке только пробелы:

>>> lines = '''\
...         greeting = "%s" % (form.menu)
...                 if greeting == "ct":
... '''
>>> lines
'        greeting = "%s" % (form.menu)\n\t\tif greeting == "ct":\n'
>>> # ^^^ is all spaces, while here     ^^^^ you use two tabs.  
...

Python расширяет вкладки до каждого восьмого столбца, но ваш редактор, вероятно, настроен на использование только 4 пробелов для вкладки, что еще больше увеличивает путаницу. Ваш greeting строка имеет отступ до 8 пробелов, а две вкладки на следующей строке расширены до 16 пробелов.

Никогда не используйте смешанные стили отступов; придерживайтесь либо только табуляции или только пробелов.

Вы можете настроить большинство редакторов на использование пробелов только для отступов; Вот что рекомендует руководство по стилю Python (PEP 8):

Вкладки или пробелы?

Никогда не смешивайте табуляции и пробелы.

Самый популярный способ сделать отступ в Python - использовать только пробелы. Второй по популярности способ - только с вкладками. Код с сочетанием символов табуляции и пробелов должен быть преобразован исключительно в пробелы. При вызове интерпретатора командной строки Python с параметром -t он выдает предупреждения о коде, который незаконно смешивает табуляции и пробелы. При использовании -tt эти предупреждения становятся ошибками. Эти варианты настоятельно рекомендуются!

Для новых проектов настоятельно рекомендуется использовать пробелы поверх вкладок. Большинство редакторов имеют функции, которые делают это легко сделать.

Другие вопросы по тегам