Почему python использует нестандартные тройные кавычки для комментариев? - PullRequest
29 голосов
/ 14 августа 2011

Почему Python просто не использует традиционный стиль комментариев, как в C / C ++ / Java:

/**
 * Comment lines 
 * More comment lines
 */

// line comments
// line comments
//

Есть ли для этого особая причина или это просто произвольно?

Ответы [ 4 ]

83 голосов
/ 14 августа 2011

Python не использует тройные кавычки для комментариев. В комментариях используется символ хеша (a.k.a. pound):

# this is a comment

Тройная кавычка - это строка документа , и, в отличие от комментария, фактически доступна в виде реальной строки для программы:

>>> def bla():
...     """Print the answer"""
...     print 42
...
>>> bla.__doc__
'Print the answer'
>>> help(bla)
Help on function bla in module __main__:

bla()
    Print the answer

Строго не требуется использовать тройные кавычки, если это строка. Использование """ - это просто соглашение (и преимущество в том, что он многострочный).

42 голосов
/ 14 августа 2011

Ряд ответов получил много баллов, но не дает полного представления о том, как все работает. Подводя итог ...

# comment - это то, как Python делает реальные комментарии (аналогично bash и некоторым другим языкам). Python имеет только комментарии «до конца строки», у него нет явной многострочной оболочки комментариев (в отличие от javascript /* .. */). Большинство Python IDE позволяют вам выбирать и комментировать блок за раз, именно так многие люди справляются с этой ситуацией.

Тогда есть обычные однострочные строки Python: они могут использовать кавычки ' или " (например, 'foo' "bar"). Основное ограничение в том, что они не переносятся на несколько строк. Вот для чего используются многострочные строки: это строки, окруженные тройными одинарными или двойными кавычками (''' или """) и заканчивающиеся только при обнаружении соответствующего неэкранированного терминатора. Они могут проходить столько строк, сколько необходимо, и включать все промежуточные пробелы.

Любой из этих двух строковых типов определяет полностью нормальный строковый объект. Им можно присвоить имя переменной, применить к ним операторы и т. Д. После анализа нет различий между любыми форматами. Однако есть два особых случая, основанные на , где строка и как она используется ...

Во-первых, если строка только что записана, без каких-либо дополнительных операций и не назначена переменной, что с ней происходит? Когда код выполняется, пустая строка в основном отбрасывается. Таким образом, люди сочли удобным комментировать большие фрагменты кода Python, используя многострочные строки (при условии, что вы избегаете любых внутренних многострочных строк). Это не так часто или семантически правильно, но допускается .

Второе использование заключается в том, что любые такие пустые строки, которые следуют сразу после def Foo(), class Foo() или запуска модуля, обрабатываются как строки, содержащие документацию для этого объекта, и сохраняются в атрибуте __doc__ объекта. Это наиболее распространенный случай, когда строки могут показаться «комментарием». Разница в том, что они выполняют активную роль как часть проанализированного кода, хранятся в __doc__ ... и, в отличие от комментария, они могут быть прочитаны во время выполнения.

17 голосов
/ 14 августа 2011

Тройные кавычки не являются комментариями.Это строковые литералы , которые охватывают несколько строк и включают эти разрывы строк в результирующей строке.Это позволяет вам использовать

somestr = """This is a rather long string containing
several lines of text just as you would do in C.
    Note that whitespace at the beginning of the line is\
 significant."""

вместо

somestr = "This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant."
5 голосов
/ 14 августа 2011

Большинство языков сценариев используют # в качестве маркера комментария, чтобы автоматически пропустить шебанг (#!), Который указывает загрузчику программы интерпретатор для запуска (как в #! / Bin / bash).В качестве альтернативы интерпретатору может быть дано указание автоматически пропустить первую строку, но гораздо удобнее просто определить # как маркер комментария и все, поэтому он пропускается как следствие.

...