LINUX.ORG.RU

Сколько типов комментариев существует в python?

 


1

2

Разве не один всего однострочный(решетка)? Понимаю, что комментарий можно сделать с помощью одинарных кавычек ('это комментарий одной строки'), двойных(«это тоже комментарий одной строки»), тройных одинарных ("' однострочный или многострочный "'), тройных двойных («»" однострочный или многострочный """), но ведь эти 4 варианта - это все строковые литералы (позволяющие сделать комментарий ).


Отформатируй код в теме, плиз.

anonymous
()

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

anonymous
()

Какая восхитительная чушь.
В питоне есть однострочные комментарии и докстринги (doc-string, строка документации), оформленные как строки в тройных кавычках:

# однострочный комментарий
def foo():
    """
    Докстринг, доступный по `foo.__doc__`
    """
    print "Hello world!" # тоже однострочный комментарий
Всё остальное от лукавого.

Virtuos86 ★★★★★
()

Понимаю, что комментарий можно сделать с помощью одинарных кавычек ('это комментарий одной строки'), двойных(«это тоже комментарий одной строки»), тройных одинарных («' однострочный или многострочный »'), тройных двойных («»" однострочный или многострочный """), но ведь эти 4 варианта - это все строковые литералы (позволяющие сделать комментарий ).

Так это не специально сделали. По докстринги ниже объяснили, что да, они используются как комментарии, но они не просто игнорируются при выполнении, а доступны через функцию help(). Остальное — это всё равно, что в c++ написать код типа

string non_used_var = "Мой комментарий"


Просто в питоне этот код менее громоздкий.

te111011010
()
Ответ на: комментарий от Virtuos86

В итоге получается

Что имеется два типа комментария (решетка и докстринг), а пара одинарных кавычек и пара двойных кавычек - просто строковые литералы?

KRex
() автор топика
Ответ на: комментарий от DELIRIUM

Тоже самое и с O0.

Попробовал локально:

$ g++ -O0 -S main.cpp
$ cat main.s
	.file	"main.cpp"
	.text
	.section .rdata,"dr"
_ZStL19piecewise_construct:
	.space 1
.lcomm _ZStL8__ioinit,1,1
	.def	__main;	.scl	2;	.type	32;	.endef
.LC0:
	.ascii "some string\0"
	.text
	.globl	main
	.def	main;	.scl	2;	.type	32;	.endef
	.seh_proc	main
main:
.LFB1581:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$32, %rsp
	.seh_stackalloc	32
	.seh_endprologue
	movl	%ecx, 16(%rbp)
	movq	%rdx, 24(%rbp)
	call	__main
	leaq	.LC0(%rip), %rdx
	movq	.refptr._ZSt4cout(%rip), %rcx
	call	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
	movq	.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_(%rip), %rdx
	movq	%rax, %rcx
	call	_ZNSolsEPFRSoS_E
	movl	$0, %eax
	addq	$32, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.def	__tcf_0;	.scl	3;	.type	32;	.endef
	.seh_proc	__tcf_0
__tcf_0:
.LFB2071:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$32, %rsp
	.seh_stackalloc	32
	.seh_endprologue
	leaq	_ZStL8__ioinit(%rip), %rcx
	call	_ZNSt8ios_base4InitD1Ev
	nop
	addq	$32, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.def	_Z41__static_initialization_and_destruction_0ii;	.scl	3;	.type	32;	.endef
	.seh_proc	_Z41__static_initialization_and_destruction_0ii
_Z41__static_initialization_and_destruction_0ii:
.LFB2070:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$32, %rsp
	.seh_stackalloc	32
	.seh_endprologue
	movl	%ecx, 16(%rbp)
	movl	%edx, 24(%rbp)
	cmpl	$1, 16(%rbp)
	jne	.L6
	cmpl	$65535, 24(%rbp)
	jne	.L6
	leaq	_ZStL8__ioinit(%rip), %rcx
	call	_ZNSt8ios_base4InitC1Ev
	leaq	__tcf_0(%rip), %rcx
	call	atexit
.L6:
	nop
	addq	$32, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.def	_GLOBAL__sub_I_main;	.scl	3;	.type	32;	.endef
	.seh_proc	_GLOBAL__sub_I_main
_GLOBAL__sub_I_main:
.LFB2072:
	pushq	%rbp
	.seh_pushreg	%rbp
	movq	%rsp, %rbp
	.seh_setframe	%rbp, 0
	subq	$32, %rsp
	.seh_stackalloc	32
	.seh_endprologue
	movl	$65535, %edx
	movl	$1, %ecx
	call	_Z41__static_initialization_and_destruction_0ii
	nop
	addq	$32, %rsp
	popq	%rbp
	ret
	.seh_endproc
	.section	.ctors,"w"
	.align 8
	.quad	_GLOBAL__sub_I_main
	.ident	"GCC: (Rev2, Built by MSYS2 project) 9.2.0"
	.def	_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc;	.scl	2;	.type	32;	.endef
	.def	_ZNSolsEPFRSoS_E;	.scl	2;	.type	32;	.endef
	.def	_ZNSt8ios_base4InitD1Ev;	.scl	2;	.type	32;	.endef
	.def	_ZNSt8ios_base4InitC1Ev;	.scl	2;	.type	32;	.endef
	.def	atexit;	.scl	2;	.type	32;	.endef
	.section	.rdata$.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, "dr"
	.globl	.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
	.linkonce	discard
.refptr._ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_:
	.quad	_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
	.section	.rdata$.refptr._ZSt4cout, "dr"
	.globl	.refptr._ZSt4cout
	.linkonce	discard
.refptr._ZSt4cout:
	.quad	_ZSt4cout

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

@fsb4000, @DELIRIUM, у меня clang 6 ругается на неиспользуемый литерал, но не выкидывает его:

$ clang++ -xc++ - -O0 <<< 'int main(){"abcdef123456"; return 0;}'
$ objdump -sj .rodata a.out

a.out:     формат файла elf64-x86-64

Содержимое раздела .rodata:
 400530 01000200 61626364 65663132 33343536  ....abcdef123456
 400540 00                                   .               
goto-vlad
()
Ответ на: комментарий от goto-vlad

Вывод: гцц слишком умный. А что за версия кстати? А то вы так обсуждаете с умным видом, но ничего не говорите о версиях.

anonymous
()
Ответ на: комментарий от anonymous

Вывод: гцц слишком умный. А что за версия кстати? А то вы так обсуждаете с умным видом, но ничего не говорите о версиях.

У меня gcc 7.4 – выкидывает уже при -O0, а clang 6 – нет (но при -O1 исправляется).

goto-vlad
()
Ответ на: комментарий от anonymous

Проверил под Win, clang при O0 тоже не выкидывает.

Версии:

$ clang++ -v
clang version 8.0.1 (tags/RELEASE_801/final)
Target: x86_64-w64-windows-gnu
Thread model: posix
InstalledDir: C:\tools\msys64\mingw64\bin

$ g++ -v
Using built-in specs.
COLLECT_GCC=C:\tools\msys64\mingw64\bin\g++.exe
COLLECT_LTO_WRAPPER=C:/tools/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/9.2.0/lto-wrapper.exe
Target: x86_64-w64-mingw32
Configured with: ../gcc-9.2.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
Thread model: posix
gcc version 9.2.0 (Rev2, Built by MSYS2 project)
fsb4000 ★★★★★
()

tcc не выкидывает литералы вообще, и при этом засовывает их в .data.

goto-vlad
()
Ответ на: комментарий от anonymous

Вывод: гцц слишком умный.

Дык его сам Столлман писал, а не какие-то яблочники.

te111011010
()
Ответ на: комментарий от te111011010

Докстринги не выкидывает, зато обычные не используемые строки туда не попадают даже без оптимизации. Повторяющиеся докстринги впрочем тоже не попадают. А 1 строка класса считает докстрингом даже если это обычная строка.

anonymous
()
Ответ на: комментарий от te111011010

Короче всё проще, если строка не первая (класса или файла), то она не считается докстрингом и не попадает в байткод в любом случае.

anonymous
()
Ответ на: комментарий от anonymous

Да, а тройные кавычки это вообще-то обычная многострочная строка, ничего особенного. Позволяет избежать экранирования EOL на каждой строке.

anonymous
()
Ответ на: В итоге получается от KRex

Вы бы на python.org зашли и БНФ грамматику Питона посмотрели. Если найдете какие еще виды комментариев, я лично удивлюсь.

Virtuos86 ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Хм, да вообще любая строка в начале тела функции это докстринг. И оформленная одной парой кавычек или апострофов, и оформленная тремя. Тройная пара кавычек только позволяет ввести многострочную строку без экранирования слэшем. Чисто для удобства зрительного восприятия. Также как любая строка в начале модуля будет докстрингом модуля, не обязательно многострочная.

Строго говоря, такие строки это и не комментарии вовсе. Но в определенных местах программы — уже комментарии :). Это в общем-то обычная тема для питона: фича за счет удобного соглашения, без всяких жестких правил.

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Это в общем-то обычная тема для питона: дичь какая-то

Докам место в комментах, а не вот в этом вот. Не разметишь, не обработаешь нормально, тупо висячие строки. И даже сами питонщики не знают что это и зачем судя по треду.

bread
()
Ответ на: комментарий от theNamelessOne

Выглядит как коментарий, плавает как коментарий, крякает как коментарий — это коментарий.

anonymous
()

Сколько типов комментариев существует в python?

Разве не один всего однострочный(решетка)?

Два: полезные и бесполезные.

anonymous
()
Ответ на: комментарий от bread

Не разметишь, не обработаешь нормально

лапки кривые

anonymous
()
Ответ на: комментарий от bread

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

И даже сами питонщики не знают что это и зачем судя по треду.

Ну, такие питонщики, значит. Может, из твоих собратьев переквалифицировались, раз такую фигню не знают).

Virtuos86 ★★★★★
()

Сколько типов комментариев существует в python?

Два. В стандартах описано подробнее, сами стандарты находятся по адресу python.org. Добро пожаловать.

anonymous
()

строковые литералы (позволяющие сделать комментарий )

А говорят, использование питона от говнокода защищает.

FedyaPryanichkov ★★
()
Последнее исправление: FedyaPryanichkov (всего исправлений: 2)
Ответ на: комментарий от FedyaPryanichkov

А говорят, использование питона от говнокода защищает.

Использование питона защищает от нормальных комментариев.

anonymous
()

Сколько типов комментариев существует в python?

Очередной идиотский вопрос на собеседовании?

beaver
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.