Почему в Python нет многострочных комментариев?


252

Хорошо, я знаю, что строки в тройных кавычках могут служить многострочными комментариями. Например,

"""Hello, I am a 
   multiline comment"""

и

'''Hello, I am a 
   multiline comment'''

Но с технической точки зрения это строки, верно?

Я погуглил и прочитал руководство по стилю Python, но не смог найти технического ответа на вопрос, почему нет формальной реализации многострочных комментариев типа / * * /. У меня нет проблем с использованием тройных кавычек, но мне немного любопытно, что привело к этому дизайнерскому решению.


8
Если вы можете сделать это как строку, зачем добавлять больше способов?
Броуди

12
Просто хотел добавить, что это не удастся, если то, что вы пытаетесь комментировать, также содержит комментарии / многострочные строки. И это, конечно, именно поэтому они нам нужны.
nycynik

50
@ S.Lott Думаю, это полезный вопрос. Чтобы понять, почему Python хорош, важно понять, какие проектные решения были приняты (и текущие решения, которые все еще принимаются). Вопрос не спорный или воинственный; это любопытно Не нужно быть таким резким по отношению к любопытству.
Марк Э. Хаас

6
Если вам нужен многострочный комментарий для трески, просто if False:код
AturSams

5
@Brody Потому что строки обрабатываются. Комментарии игнорируются. Есть проблемы с использованием строк в качестве комментариев. Просто посмотрите вокруг :)
ADTC

Ответы:


266

Я сомневаюсь, что вы получите лучший ответ, чем «Гвидо не чувствовал необходимости в многострочных комментариях».

Гвидо написал в твиттере об этом:

Совет по Python: Вы можете использовать многострочные строки в качестве многострочных комментариев. Если они не используются в качестве строк документации, они не генерируют код! :-)


28
Посмотрите твит Гвидо об этом.
Петр Викторин

15
Одним из недостатков смешанных многострочных комментариев и комментариев к блокам является то, что IDE не знает, чего вы хотите, поэтому не может отображать комментарии в другом стиле по мере необходимости.
Байян Хуан

21
Это также делает невозможным закомментировать код многострочными строками (и может привести к ошибкам отступа, если вы не будете осторожны). Еа!
Майк Грэм

3
Я работал во многих областях, где, если ваш код содержит закомментированный код, тогда ваш код отклоняется, и вы можете даже получить приглашение обновить свое резюме. Либо удалите код, который не нужен, не проблема, если код находится под контролем версии, или используйте if False:код, который необходимо отключить.
Стив Барнс

4
@ SteveBarnes согласны с тем, что большие блоки закомментированного кода в производстве - это плохо. Но я не понимаю, почему if Falseлучше. Он выполняет то же самое, но менее ясно (поскольку на первый взгляд не так очевидно, что блок кода отключен).

59

Многострочные комментарии легко ломаются. Что делать, если у вас есть следующее в простой программе калькулятора?

operation = ''
print("Pick an operation:  +-*/")
# Get user input here

Попробуйте прокомментировать это многострочным комментарием:

/*
operation = ''
print("Pick an operation:  +-*/")
# Get user input here
*/

К сожалению, ваша строка содержит разделитель конечного комментария.


174
Самым приятным в этом ответе является то, как он обрабатывается подсветкой синтаксиса SO.
Ницше Жу

73
Это одна из многих причин, по которым у нас есть экранирующие символы, я не считаю это хорошей причиной, чтобы НЕ иметь поддержку многострочных комментариев.
Натали Адамс

34
Я не понимаю вашу логику - возможно, мой комментарий был недостаточно ясен. Если мы использовали \ в качестве escape-символа: print («Выбрать операцию: + - * \ /») «* /» больше не обозначает конечный блок комментария, так как буквально / будет напечатан. Идите и проверьте это на C ++. На самом деле подсветка синтаксиса SO покажет, что это правильно. Это не сложный предмет, он существует годами на других языках. Я бы попросил вас обновить ваш пост, чтобы включить использование escape-символов, чтобы показать, что вы МОЖЕТЕ использовать «* /» в своем коде.
Натали Адамс

23
Что делать, если ваш код содержит «». К сожалению, ваш код содержит разделитель конца комментария
Сиами

21
Многострочные комментарии не являются по сути разрушаемыми; просто большинство их реализаций (включая Python). На мой взгляд, очевидный способ сделать многострочные комментарии в Python - это просто позволить мне начать блок комментариев #:и использовать отступ, чтобы показать, когда комментарий закончится. Он чистый, последовательный и отлично справляется с вложенностью.
GatesDA

34

Текст в тройных кавычках НЕ должен рассматриваться как многострочный комментарий; условно, это строки документов . Они должны описывать, что делает ваш код и как его использовать, но не для таких вещей, как комментирование блоков кода.

Согласно Гвидо, многострочные комментарии в Python - это просто непрерывные однострочные комментарии (поиск по «блочным комментариям»).

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

if False:
    # A bunch of code

6
Кажется, с тех пор Гвидо изменил свое мнение .
Петр Викторин

5
Что касается решения «if false:», то дело в том, что в python, так как он работает с вкладками, вам придется вкладывать весь код под «if False:». И разматывать кусок потом. Таким образом, вы должны быть очень изящны с вашим текстовым редактором.
Барлоп

3
если вы используете приличный редактор, это должно быть столько же времени, сколько и * /
AturSams

@ barlop yup - учите своих редакторов! Обычно это достигается менее чем за секунду в vim сV}>>
Triptych

30

Это, вероятно, восходит к основной концепции, что должен быть один очевидный способ выполнить задачу. Дополнительные стили комментариев добавляют ненужные сложности и могут снизить читабельность.


8
Я считаю, что это проблема: использование строки в качестве комментария неочевидно и нарушает принцип «один способ выполнить задачу», поскольку есть два способа сделать комментарии: строки и #.
GatesDA

1
Но это не сильно отличается от того, что у вас есть в языках на основе C: / * vs //, поэтому я не вижу, насколько это значительно хуже.
Бен Робертс

// Рассмотрим, ПОЧЕМУ кто-то хочет многострочный комментарий. У меня есть веские причины: ... я не могу думать ни о чем, кроме "мне не нужно вводить столько же этих # doohickeys" и "мне нужно отображать этот конкретный комментарий очень точным способом, и этот точный способ не не допускаю предшествующего #. " Скажем, кто-то хочет сделать диаграмму ASCII или поместить некоторый ссылочный код javascript для копирования и вставки, если возникает конкретная проблема. Единственный очевидный способ выполнить задачу здесь не охватывает крайние случаи этой задачи. Я согласен, однако, что дополнительные стили комментариев ПЛОХО.
Натан Басанезе

3
«Мне не нужно вводить столько же этих # doohickeys». Именно поэтому почти все языки имеют блочные комментарии (/ * .. * /). Хотите верьте, хотите нет, но мне нравится документировать, что делает мой код: входы, выходы, используемые алгоритмы, параметры ... Это много текста, который также изменяется. Ограничение только однострочными комментариями просто смешно. Обратите внимание, что я НЕ защищаю подход для комментирования кода - хотя это часто удобно при использовании альтернативных подходов, если понятны все возможные возможные побочные эффекты.
Альберт Годфринд

3
Еще одна вещь, которую я негодую по поводу Python - это то, что он по сути разработан для одного человека. Что бы ни говорил Гвидо, это правда ... Так что у нас есть все эти странные несовместимости между языковыми версиями. Зачем ? Потому что Гвидо так сказал ...
Альберт Годфринд

12

Ну, тройные кавычки используются как многострочные комментарии в строках документов. И # комментарии используются как встроенные комментарии, и люди привыкли к этому.

Большинство языков сценариев также не имеют многострочных комментариев. Может в этом причина?

См. PEP 0008 , раздел Комментарии

И посмотрите, предлагает ли ваш редактор Python комбинацию клавиш для комментирования блоков. Emacs поддерживает его, как и Eclipse, предположительно большинство приличных IDE.



5

Лично мой стиль комментария, скажем, в Java похож на

/*
 * My multi-line comment in Java
 */

Так что наличие однострочных комментариев не так уж плохо, если ваш стиль типичен для предыдущего примера, потому что для сравнения вы бы имели

#
# My multi-line comment in Python
#

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

'
' This is a VB.NET example
'

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



4
# This
# is
# a 
# multi-line
# comment

Для этого используйте блок комментариев или выполните поиск и замену (s / ^ / # / g) в вашем редакторе.


3

Я решил эту проблему, загрузив макрос для моего текстового редактора (TextPad), который позволяет мне выделять строки, а затем вставляет # в начале каждой строки. Подобный макрос удаляет #. Некоторые могут спросить, почему многострочный необходим, но это удобно, когда вы пытаетесь «отключить» блок кода для целей отладки.


1

Для тех, кто ищет многострочные комментарии в Python - использование формата тройных кавычек может иметь некоторые проблематичные последствия, поскольку я только что научился трудному пути. Учти это:

this_dict = {
    'name': 'Bob',

"""
This is a multiline comment in the middle of a dictionary
"""

    'species': 'Cat'
}

Многострочный комментарий будет заправлен в следующую строку, путая 'species'ключ. Лучше просто использовать #для комментариев.


0

Поскольку соглашение # является распространенным, и на самом деле вы не можете ничего сделать с многострочным комментарием, чего нельзя с комментарием # -sign. Это историческая случайность, подобно происхождению /* ... */комментариев к PL / I,


0

Предположим, что они просто считались ненужными. Так как просто набрать#a comment текст, многострочные комментарии могут состоять из множества однострочных комментариев.

Для HTML , с другой стороны, больше нужны мультилинеры. Труднее продолжать печатать <!--comments like this-->.


4
Дело не в этом - очевидные варианты использования как однострочных, так и многострочных комментариев. Я широко использовал их на других языках (хотя я знаю, что путинские пуристы не заботятся о других языках). ;)
Johndodo

1
попробуйте сделать это с 200 строками кода, которые вы должны вынуть, вставить обратно и вынуть снова. Ввод 200 начальных # очень быстро устареет.
DragonLord

0

Это всего лишь предположение .. но

Поскольку они являются строками, они имеют определенную семантическую ценность (компилятор от них не избавляется), поэтому имеет смысл использовать их в качестве строк документации. Они фактически становятся частью AST , поэтому извлечение документации становится проще.


0

Кроме того, многострочные комментарии - сука . Извините, но независимо от языка я не использую их ни для чего другого, кроме как для отладки. Скажем, у вас есть такой код:

void someFunction()
{
    Something
    /*Some comments*/
    Something else
}

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

void someFunction()
{ /*
    Something
   /* Comments */
   Something more*/
}

Это действительно раздражает.


3
ну здорово, но у Python нет /*комментариев в стиле.
Триптих

17
Правильно, поскольку в python нет настоящих многострочных комментариев, было довольно сложно приводить примеры в python.
Мартиерт

2
Я лично не понимаю проблему. Просто удалите лишние * /. Или используйте //, чтобы закомментировать отдельные строки, если вам нужно быть точным.
Натали Адамс

4
Существует несколько языков (многие из которых функционируют по любой причине), которые допускают вложенные комментарии. Ищите «вложенный» в rosettacode.org/wiki/Comments для примеров.
Кит

1
ну да, было бы неприятно помещать многострочный комментарий в многострочный комментарий. И хотя я помню только часть своей программы за раз, я, по крайней мере, помню, какую часть своей программы я смотрю и что я закомментировал. Но если вы даже не можете этого вспомнить, вы можете использовать тот факт, что некоторые IDE выделяют курсивом то, что является комментарием. В любом случае, очевидно, что для такой крошечной функции вы можете использовать однострочные комментарии. Но если вы закомментируете большую часть программы, вам действительно нужен многострочный комментарий. или текстовый редактор с этой функцией.
Барлоп

0

Многострочные комментарии с использованием IDLE на:

  • Mac OS X , после выбора кода, закомментируйте блок кода с помощью Ctrl+ 3и раскомментируйте с помощью Ctrl+ 4.

  • В Windows после выбора кода закомментируйте блок кода с помощью Ctrl+ Alt+ 3и раскомментируйте с помощью Ctrl+ At+ 4.


-1

Я помню, как читал об одном парне, который поместил бы его многострочные комментарии в тройную кавычку:

x = '''
This is my
super-long mega-comment.
Wow there are a lot of lines
going on here!
'''

Это занимает немного памяти, но дает вам возможность многострочных комментариев, и плюс большинство редакторов выделят синтаксис для вас :)

Также легко закомментировать код, просто обернув его

x = '''

и

'''

18
удалите x =и это не займет никакой памяти.
эндолит
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.