Как подсчитать строки кода в Python, исключая комментарии и docstrings?
Я хочу как можно точнее подсчитывать строки кода в проекте с несколькими файлами Python, но без учета комментариев, докстронгов или пустых строк в общей сумме.
Сначала я попытался использовать cloc, который доступен как пакет Debian. Но cloc рассматривает большинство докстеров как код, даже если они являются комментариями. (Обновление:) - последние версии cloc теперь обрабатывают Docstrings Python как комментарии.)
Я замечаю некоторые комментарии ниже, говоря, что в общую сумму должны включаться docstrings, потому что они могут использоваться кодом для влияния на поведение во время выполнения и, следовательно, считаться частью кода программы/данных/config. Ярким примером этого является "ply", который просит вас написать функции с docstrings, которые, как я помню, содержат грамматику и регулярные выражения, которые являются центральными для операции программы. Однако это кажется мне очень редким исключением. Большую часть времени docstrings действуют так же, как комментарии. В частности, я знаю, что это верно для всего кода, который я хочу измерить. Поэтому я хочу исключить их как таковые из моих строк.
Ответы
Ответ 1
Вероятно, правильно включить докстроны Python в число "строк кода". Обычно комментарий отбрасывается компилятором, но docstrings анализируются:
См. PEP 257 - Доключительные соглашения:
Docstring - строковый литерал, который встречается как первый оператор в определение модуля, функции, класса или метода. Такая докшлина становится специальным атрибутом __doc__
этого объекта.
...
Строковые литералы, встречающиеся в другом месте в коде Python, также могут действовать как документация. Они не распознаются компилятором байт-кода Pythonи недоступны в качестве атрибутов объекта времени выполнения.
Другими словами, docstrings компилируются и представляют собой очень реальный код кода программы. Кроме того, они обычно используются doctest module
для модульного тестирования, как строки использования для утилит командной строки и т.д.
Ответ 2
Строки комментариев могут быть строками кода в python. См. doctest
, например.
Кроме того, вам будет трудно найти разумный/надежный способ рассмотреть такой случай как комментарий или код:
foo = ('spam',
'''eggs
eggs
eggs'''
'''more spam''',
'spam')
Просто подсчитайте строки комментариев, я думаю, что большинство программистов согласятся, что это будет хорошей мерой для того, что вы на самом деле пытаетесь измерить.
Ответ 3
Tahar не учитывает docstrings. Здесь его функция count_loc:
def count_loc(lines):
nb_lines = 0
docstring = False
for line in lines:
line = line.strip()
if line == "" \
or line.startswith("#") \
or docstring and not (line.startswith('"""') or line.startswith("'''"))\
or (line.startswith("'''") and line.endswith("'''") and len(line) >3) \
or (line.startswith('"""') and line.endswith('"""') and len(line) >3) :
continue
# this is either a starting or ending docstring
elif line.startswith('"""') or line.startswith("'''"):
docstring = not docstring
continue
else:
nb_lines += 1
return nb_lines
Ответ 4
Вы посмотрели на http://www.ohloh.net/p/ohcount - всегда были на деньги для меня - хотя я не использую python