Python: Я получаю сообщение об ошибке «блок с отступом» в последних 3 кавычках («» ») моих комментариев в функциях. - PullRequest
4 голосов
/ 21 января 2011

Супер странно, нет? Код обидчика:

def main():
"""
main function
"""
    # Argument handling

    args = sys.argv[1:]
    if not args:
        print "usage is: ...

Третья цитата, где я получаю обычную ошибку отступа:

>>>Import someScript
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "someScript.py", line 24
    """
      ^

Если я удаляю комментарии (очевидно, я не хочу), то следующая функция, которая должна быть определена, получает ту же ошибку в том же месте своих комментариев. Если я удалю все комментарии из функций, ошибка исчезнет.

Я не понимаю! Зачем ожидать отступ там? Я пишу в Komodo Edit частично, потому что он не позволяет вам смешивать пробелы и вкладки, но просто чтобы убедиться, что я выполнил поиск и, конечно же, нет никаких чертовых вкладок. Не то чтобы в любом случае это имело бы смысл.

Что дает, гуру?

Ответы [ 2 ]

17 голосов
/ 21 января 2011

Вам необходимо сделать отступ для строки документации вместе с блоком для вашей функции.

После каждого двоеточия (:) должен сразу следовать блок с отступом.

1 голос
/ 21 января 2011

Как уже говорилось, строка документа не имеет отступов. Было бы лучше получить ошибку в первой строке строки, но в настоящее время лексер работает не так. Вместо этого он принимает целый токен за раз - помните, что строки в тройных кавычках подразумевают перенос строки - затем выдает ошибку, если она неверно введена. Этот символ - вся строка в тройных кавычках, которая заканчивается на другой строке. Для сравнения:

>>> def f():
... """one line"""
  File "<stdin>", line 2
    """one line"""
                 ^
IndentationError: expected an indented block
>>> def f():
... foo()
  File "<stdin>", line 2
    foo()
      ^
IndentationError: expected an indented block
>>> def f():
... return 42
  File "<stdin>", line 2
    return 42
         ^
IndentationError: expected an indented block

Обратите внимание, что во втором примере он указывает на конец "foo", первого символа в этом неверно введенном утверждении: это то же самое, что указание на конец строки документации.

...