Подтвердить что ты не робот

Как подсчитать строки кода в Python, исключая комментарии и docstrings?

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

Сначала я попытался использовать cloc, который доступен как пакет Debian. Но cloc рассматривает большинство докстеров как код, даже если они являются комментариями. (Обновление:) - последние версии cloc теперь обрабатывают Docstrings Python как комментарии.)

Я замечаю некоторые комментарии ниже, говоря, что в общую сумму должны включаться docstrings, потому что они могут использоваться кодом для влияния на поведение во время выполнения и, следовательно, считаться частью кода программы/данных/config. Ярким примером этого является "ply", который просит вас написать функции с docstrings, которые, как я помню, содержат грамматику и регулярные выражения, которые являются центральными для операции программы. Однако это кажется мне очень редким исключением. Большую часть времени docstrings действуют так же, как комментарии. В частности, я знаю, что это верно для всего кода, который я хочу измерить. Поэтому я хочу исключить их как таковые из моих строк.

4b9b3361

Ответ 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