21

我想尽可能准确地计算多文件 Python 项目中的代码行数,但总数中不包括注释、文档字符串或空行。

我首先尝试使用 cloc,它作为 Debian 软件包提供。但是 cloc 将大多数文档字符串视为代码 - 即使它们是注释。(更新:不再 - cloc 的最新版本现在将 Python 文档字符串视为注释。)

我注意到下面的一些评论说文档字符串应该包含在总数中,因为它们可能被代码用来影响运行时的行为,因此算作程序代码/数据/配置的一部分。一个突出的例子是“ply”,它要求您使用文档字符串编写函数,据我回忆,这些文档字符串包含对程序操作至关重要的语法和正则表达式。然而,在我看来,这似乎是一个非常罕见的例外。大多数时候,文档字符串的行为就像注释一样。具体来说,我知道一个事实对于我想要测量的所有代码都是正确的。所以我想从我的行数中排除它们。

4

4 回答 4

7

注释行可以是 python 中的代码行。doctest例如参见。

此外,您将很难找到一种明智/可靠的方式来将这样的案例视为注释或代码:

foo = ('spam', 
       '''eggs
          eggs
          eggs'''
       '''more spam''',
       'spam')

只需数一下注释行,我认为大多数程序员都会同意它对于您实际尝试测量的任何内容都是一个很好的衡量标准。

于 2012-01-31T09:08:12.287 回答
7

在“代码行”计数中包含 Python 文档字符串可能是正确的。通常编译器会丢弃注释,但会解析文档字符串:

请参阅PEP 257 - 文档字符串约定

文档字符串是作为模块、函数、类或方法定义中的第一条语句出现的字符串文字。这样的文档字符串成为该__doc__对象的特殊属性。

...

Python 代码中其他地方出现的字符串文字也可以作为文档。它们不能被 Python 字节码编译器识别, 也不能作为运行时对象属性访问。

换句话说,文档字符串编译并以非常真实的方式构成程序的代码。此外,它们通常被doctest module用于单元测试,作为命令行实用程序的使用字符串等。

于 2012-01-31T09:08:35.017 回答
7

Tahar不计算文档字符串。这是它的 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
于 2013-01-05T10:17:42.957 回答
3

你看过http://www.ohloh.net/p/ohcount - 对我来说一直很赚钱 - 虽然我不使用python

于 2012-01-31T08:45:56.133 回答