Python: я получаю сообщение об ошибке «блок с отступом» в последних трех кавычках («») моих комментариев под функциями. Что случилось?

Супер странно, нет? Код нарушения:

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 отчасти потому, что он не позволяет вам смешивать пробелы и вкладки, но просто чтобы убедиться, что я провел поиск, и, конечно же, там нет чертовых вкладок. Не то, чтобы это имело смысл в любом случае, если бы они были.

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


person WaxProlix    schedule 21.01.2011    source источник
comment
комментарии начинаются с #, вы пишете строку документации   -  person Jochen Ritzel    schedule 21.01.2011
comment
Кстати, загляните в optparse, argparse или что-то подобное, поскольку они довольно просты в использовании и позволяют лучше обрабатывать аргументы.   -  person Fred Nurk    schedule 21.01.2011


Ответы (2)


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

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

person Rafe Kettler    schedule 21.01.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», первого символа в этом утверждении с неправильным отступом: это то же самое, что указывать на конец вашей строки документации.

person Fred Nurk    schedule 21.01.2011