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

Ing*_*her 20 python lines-of-code

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

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

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

wim*_*wim 6

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

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

foo = ('spam', 
       '''eggs
          eggs
          eggs'''
       '''more spam''',
       'spam')
Run Code Online (Sandbox Code Playgroud)

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

  • 不同意.虽然技术上文档字符串是从代码编译和访问的,但它们的使用和语义的巨大优势是一个注释.它们应排除在行数之外.检测模糊外观的方法(如本答案中的方法)是使用AST进行行计数. (2认同)

Ham*_*ish 6

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

参见PEP 257 - Docstring约定:

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

...

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

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

  • 不同意.虽然docstrings被编译并且可以被代码使用,但它们的使用和语义都是注释.应将它们排除在任何有意义的行数之外. (3认同)
  • @JonathanHartley我个人认为"编译并且可以被代码使用"是一个很好的论据*因为它被计算在内. (3认同)

ych*_*che 6

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
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的合理建议,也感谢您没有像其他响应者一样提出关于文档字符串是代码的荒谬和自以为是的主张。代码行_是一种有效的(实际上是最好的:http://herraiz.org/blog/2010/11/22/making-software-is-out/)代码复杂性的度量以及何时需要该复杂性来反映原始源代码(而不是我在文档字符串中的大量 _math_ 注释),我需要省略文档字符串! (11认同)
  • 我相信 docstrings 中的文档是用于文档的 (3认同)