22

В Python, для однострочных комментариев используется символ #. Но если нужно закомментировать большой блок кода, то приходится приписывать # в начале каждой строки. Это очень неудобно при отладке.

Есть ли какая-то возможность использовать многострочные комментарии (аналог /* ... */ из Си) в Python?

UPD:

Знаю, что различные IDE позволяют делать такие вещи автоматически, но хотелось бы более элегантного решения, не зависящего от средства редактирования кода и различных утилит.

Dmitriy Simushev
  • 17,999
  • 5
  • 49
  • 85
  • Как это сделать в VIM штатными средствами: http://stackoverflow.com/a/2561497 – Gennadiy Zolotaryov Oct 12 '15 at 19:50
  • 1
    Мой вопрос сводится скорее к "как использовать многострочные комментарии в языке, где нет многострочных комментариев", а не к "как использовать редакторы кода для автоматического создания пачки однострочных комментариев" – Dmitriy Simushev Oct 13 '15 at 11:16

5 Answers5

34

Насколько мне известно, отдельного синтаксиса для многострочных комментариев в Python нет. В тоже время, можно использовать строковые литералы, заключенные в тройные апострофы, например так:

'''
Это строковый литерал.
Но здесь он используется как многострочный комментарий
'''

Строковые литералы, заключенные в тройные кавычки, могут содержать:

  • кавычки (")
  • апострофы (')
  • docstring комментарии ("""func desc""")
  • переводы строк

В тоже время, стоит помнить, что такой строковый литерал не должен содержать внутри символов '''. Это требование аналогично запрету на последовательность символов */ внутри многострочного комментария Си.

Кстати, этот же хак, предлагает использовать создатель языка Python в одном из своих твитов.

В тоже время, как верно отметил @jfs, руководство по стилю кода (pep-8) рекомендует использовать # для блочных комментариев.

Dmitriy Simushev
  • 17,999
  • 5
  • 49
  • 85
  • 2
    Действительно, это способ описан во всех (или почти всех) книгах о Python – avp Oct 12 '15 at 12:11
7

Руководство по стилю кода (pep-8) рекомендует использовать # для блочных комментариев.

Но если нужно закомментировать большой блок кода, то приходится приписывать # в начале каждой строки. Это очень неудобно при отладке.

Один из явных признаков неумелого программирования -- это наличие закомментированных фрагментов кода. Используйте систему контроля версий и/или ваше IDE, чтобы временно убрать/закомментировать код при отладке. Настройте ваше окружение, чтобы вы могли это делать не задумываясь, нажимая пару клавиш.

Знаю, что различные IDE позволяют делать такие вещи автоматически, но хотелось бы более элегантного решения, не зависящего от средства редактирования кода и различных утилит.

Закомментированный код не должен добавляться в систему контроля версий, поэтому для временных изменений, которые не переживут одну сессию редактирования кода, один клавишный аккорд (например, M-; в Emacs), как правило, достаточен, чтобы закомментировать/раскомментировать кусок кода.


"""multiline string literal""" не является многострочным комментарием в Питоне. Это просто строковая константа, которая позволяет использовать буквальные символы новой строки без экранирования (такого как \n). Часто используется для описаний модулей, классов, функций/методов прямо в коде:

>>> def f():
...     """abc"""
... 
>>> f.__doc__
'abc'

Попытка использовать """""" в качестве многострочного комментария сломается на первой docstring, даже если бы не было других более подходящий решений для данной задачи.

jfs
  • 52,361
  • 1
    IDE, как впрочем и другие редакторы доступны не во всех средах. Существует системы где есть только nano и нет полномочий установить что-то еще. Я отлично знаю, что в """ это не комментарий. Но в python просто нет другого синтаксиса для многострочных комментариев. Собственно я и вопрос-то создал как некий faq, с целью показать хак в языке, а не правильные подходы к разработке, хитрости в обращении с IDE и редакторами и/или VCS. И еще. Синтаксис ''' вполне может включать docstring, что я и добавил в свой ответ. – Dmitriy Simushev Oct 13 '15 at 10:57
  • @DmitriySimushev: если вам доступно только nano, то спрашивайте вопрос про nano, а не общий вопрос "Многострочные комментарии в Питоне". Даже если Вы используете nano, то """ не очень полезно: без подсвечивания синтаксиса Вы даже не увидите, какая строчка закомментирована, а какая нет -- проще просто удалить фрагмент временно. – jfs Oct 13 '15 at 11:01
  • 1
    В том-то и дело, что вопрос не про редактор. Вопрос про то, как можно использовать многострочные комментарии в языке где нет синтаксиса для многострочных комментариев. Цель этого вопроса-ответа, показать, что способ все-таки есть. – Dmitriy Simushev Oct 13 '15 at 11:03
  • Как я уже сказал ''' нормально работает с docstring комментариями. – Dmitriy Simushev Oct 13 '15 at 11:04
  • @DmitriySimushev: ''' также может быть использован для docstrings (как и любая другая строковая константа). Цель моего ответа, показать, что не нужно использовать """ в качестве комментария -- есть лучше методы – jfs Oct 13 '15 at 11:06
  • есть лучше методы можете привести хоть один, не сводящийся к "используйте фичастый редактор кода"? – Dmitriy Simushev Oct 13 '15 at 11:13
  • 1
    @DmitriySimushev: я явно их указал: используйте систему контроля версий, используйте редактор -- если Вы не можете использовать ни то ни другое -- то спрашивайте про Ваши конкретные урезанные обстоятельства -- программирование, используя только магнитную иголку и твёрдую руку не очень распространено :) – jfs Oct 13 '15 at 11:26
  • В принципе также можно использовать #if 0 ... #endif и gcc -E - < prog.py | python для удаления комментариев перед интерпретацией (шутка, конечно же, но позволяет делать даже вложенные комментарии) – avp Oct 13 '15 at 12:28
4

В PyCharm можно выделить блок который нужно закомментировать и нажать Ctrl+/ PyCharm в начале каждой строки поставит '#' Если нужно будет раскоментировать нужно опять же нажать Ctrl+/ и '#' уберутся! Очень удобно!

3

Почти все редакторы умеют выделять текст столбцом.

В большинстве из них это делается при помощи Alt+Shift+Стрелка, в редакторах на основе Idea используется переключение по Alt+Shift+Insert между обычным и колоночным режимами.

Я всегда, когда комментирую код, использую однострочные комментарии, выделив нужную группу строк. Это удобно, поскольку во-первых, факт закомментированности не зависит от наличия комментариев в комментируемом коде, а во-вторых, сразу чётко видно единый закомментированный участок кода (при комментировании кнопкой комментария IDE игнорируют пустые строки).

PS: Если код комментируется для долгосрочных целей, то ставлю 4 слеша вместо двух.

Qwertiy
  • 123,725
  • В python конструкция // (как и ////) не является комментарием :) Использование IDE для массового создания однострочных комментариев может быть полезным, но увы не всегда применимо. – Dmitriy Simushev Oct 12 '15 at 12:25
  • 1
    @DmitriySimushev, да про слеши я говорил не про питон. Но ведь ставить тем же способом решётку никто не мешает. А использование IDE совсем не обязательно. Текстовые редакторы это тоже умеют. Тот же Notepad++, например. – Qwertiy Oct 12 '15 at 13:12
  • Про редакторы: я имел в виду какой-нибудь mcedit (nano, vi, ...) работающий в терминале. Если есть что-то что автоматом проставляет пачку однострочных комментариев, то ваш ответ -- решение. Если нет, то нет :) – Dmitriy Simushev Oct 12 '15 at 13:24
  • @DmitriySimushev, надо ж было предупреждать, что линукс с консолью. Уверен, что vim можно как-то заставить это сделать. – Qwertiy Oct 12 '15 at 13:27
  • Ну про консоль -- это всего лишь пример. На самом деле оригинальный вопрос сводится к "как использовать многострочные комментарии в python", а не к "как автоматически закомментировать n-строк кода" ;) – Dmitriy Simushev Oct 12 '15 at 13:31
1

Многострочные комментарии в python только с помощью """ (три кавычки)

Kromster
  • 13,809
redL1ne
  • 2,190