python代码注释率统计脚本

2023-09-05 14:19:37 浏览数 (1)

待解决问题

最近由于项目需要, 需要统计一下代码的注释率, 必须要达到30%才算合格, 于是搜呀搜, 想找一个写好的轮子, 直接拿来使用, 确实有好多脚本, 但是呢! 代码要不就是只统计#开头的, 要不就是统计#号开头的和三单双引号开头的, 其实并没有太大的问题, 只是还有一种情况, 如下:

代码语言:javascript复制
example_str = """
    这是一个示例的字符串, 并不是注释
"""

动手解决

这种情况就不应该算注释行, 而这些脚本没有算这种情况, 所以就自己动手写了一个脚本, 可能会有bug, 欢迎指出, 直接上源码:

comment_rate.py

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-08-02 17:13:56
# @Last Modified by: Mehaei
# @Last Modified time: 2023-08-02 21:05:40
import argparse
import os
import sys


def one_file_total(fpname):
    """
    统计一个文件的注释率
    :param fpname: 文件路径
    """
    with open(fpname, 'r', encoding='utf-8') as f:
        code_lines = 0
        comment_lines = 0
        blank_lines = 0
        is_var = False
        is_comment = False
        for index, line in enumerate(f, start=1):
            line = line.strip()
            if "'''" in line or '"""' in line:
                if "=" in line:
                    is_var = True
                else:
                    if is_var:
                        code_lines  = 1
                        is_var = False
                        continue
                    else:
                        if is_comment:
                            comment_lines  = 1
                            is_comment = False
                            continue
                        else:
                            is_comment = True
            if is_var:
                code_lines  = 1
            elif is_comment:
                comment_lines  = 1
            elif not line:
                blank_lines  = 1
            elif line.startswith("#"):
                comment_lines  = 1
            else:
                code_lines  = 1

    print("#"*50)
    print(fpname)
    print("注释: %d" % comment_lines)
    print("空行: %d" % blank_lines)
    print("代码: %d" % code_lines)
    program_lines = comment_lines   code_lines
    print("程序行数: %d" % program_lines)
    comment_rate = comment_lines / program_lines
    print("注释率: {:.2f}%".format(comment_rate * 100))
    print("#"*50)


# 全局统计变量
tcomment_lines = tblank_lines = tcode_lines = 0


def main(fpname):
    """
    统计脚本入口函数
    :param fpname: 文件或文件夹路径
    """
    global tcomment_lines
    global tblank_lines
    global tcode_lines
    if os.path.isdir(fpname):
        for pname in os. listdir(fpname):
            if pname.startswith("."):
                continue
            fp = f"{fpname}/{pname}"
            if os.path.isdir(fp):
                main(fp)
            if os.path.isfile(fp) and fp.endswith(" .py"):
                comment_lines, blank_lines, code_lines = one_file_total(fp)
                tcomment_lines  = comment_lines
                tblank_lines  = blank_lines
                tcode_lines  = code_lines
    elif os.path.isfile(fpname) and fpname.endswith(".py"):
        return one_file_total(fpname)
    else:
        print(f"fpname: {fpname}不是文件夹也不是py文件")


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="文件注释率统计脚本")
    parser.add_argument('-p', dest='path', type=str, default="./", help="要检测的文件或文件路径")
    args = parser.parse_args()
    fpname = args.path
    if not os.path.exists(fpname):
        print(f"文件路径:{fpname}不存在")
        sys.exit(-1)
    main(fpname)
    if tcomment_lines or tblank_lines or tcode_lines:
        print("*"*50)
        print(fpname)
        print("项目总注释:%d" % tcomment_lines)
        print("顶目总空行:%d" % tblank_lines)
        print("项目总代码:%d" % tcode_lines)
        program_lines = tcomment_lines   tcode_lines
        print("项目总程序行数: %d" % program_lines)
        comment_rate = tcomment_lines / program_lines
        print("项目总备注率:{:.2f}%".format(comment_rate * 100))
        print("*"*50)

测试及使用

测试文件: example.py

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-08-02 20:57:42
# @Last Modified by: Mehaei
# @Last Modified time: 2023-08-02 20:59:28
# 导入模块
import os


# 入口函数
def main():
    msg = """
        message info
    """
    print(msg)
    print(os.getcwd())


# 调用函数
main()

脚本使用

帮助

python3.7 comment_rate.py --help

代码语言:javascript复制
~/Downloads/web » python3.7 comment_rate.py --help
usage: comment_rate.py [-h] [-p PATH]

文件注释率统计脚本

optional arguments:
  -h, --help  show this help message and exit
  -p PATH 要检测的文件或文件路径

统计单个文件

python3.7 comment_rate.py -p "example.py"

代码语言:javascript复制
~/Downloads/web » python3.7 comment_rate.py -p "example.py"
##################################################
example.py
注释: 8
空行: 4
代码: 8
程序行数: 16
注释率: 50.00%
##################################################

统计文件夹下所有的py文件

python3.7 comment_rate.py -p "/test"

代码语言:javascript复制
~/Downloads/web » python3.7 comment_rate.py -p "/test"
##################################################
/test/mq_learn.py
注释: 5
空行: 3
代码: 1
程序行数: 6
注释率: 83.33%
##################################################
............
##################################################
/test/py_verify_code.py/local_code.py
注释: 5
空行: 3
代码: 10
程序行数: 15
注释率: 33.33%
##################################################
**************************************************
/test
项目总注释:235
项目总空行:335
项目总代码:815
项目总程序行数: 1050
项目总备注率:22.38%
**************************************************

源代码地址

代码我放在github上了, 欢迎star, 如果有bug也麻烦指出来~~

https://github.com/Mehaei/code_count

0 人点赞