如何计算Python中除了注释和文档字符串之外的代码行?

时间:2012-01-31 08:43:50

标签: python lines-of-code

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

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

我注意到下面的一些评论说文档字符串应该包含在总数中,因为它们可能被代码用来影响运行时的行为,因此算作程序代码/ data / config的一部分。一个突出的例子是'ply',它要求你用docstrings编写函数,我记得这些函数包含语法和正则表达式,这些都是程序操作的核心。然而,在我看来这是一个非常罕见的例外。大多数时候,文档字符串就像评论一样。具体来说,我知道对于我想要测量的所有代码都是如此。所以我想从我的行数中排除它们。

4 个答案:

答案 0 :(得分:6)

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

此外,您将很难找到合理/可靠的方式来将此类案例视为评论或代码:

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

只要计算评论行,我想大多数程序员都会同意它对于你实际想要测量的任何东西都是一个很好的衡量标准。

答案 1 :(得分:6)

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

请参阅PEP 257 - Docstring Conventions

  

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

     

...

     

Python代码中出现其他的字符串文字也可能起作用   文档。 Python字节码编译器无法识别它们   并且不能作为运行时对象属性访问..

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

答案 2 :(得分:4)

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

答案 3 :(得分:2)

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