前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python代码注释率统计脚本

python代码注释率统计脚本

作者头像
不止于python
发布于 2023-09-05 06:19:37
发布于 2023-09-05 06:19:37
48100
代码可运行
举报
文章被收录于专栏:不止于python不止于python
运行总次数:0
代码可运行

待解决问题

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
example_str = """
    这是一个示例的字符串, 并不是注释
"""

动手解决

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

comment_rate.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- 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
代码运行次数:0
运行
AI代码解释
复制
# -*- 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
代码运行次数:0
运行
AI代码解释
复制
~/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
代码运行次数:0
运行
AI代码解释
复制
~/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
代码运行次数:0
运行
AI代码解释
复制
~/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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
前端面试HTML相关(一)
clientTop,offsetTop,clientHeight 以及 scrollTop 等各种距离高度做对比,利用scroll事件,节流判断图片的位置;
用户7572539
2022/11/21
2940
前端面试HTML相关(一)
初探富文本之基于虚拟滚动的大型文档性能优化方案
虚拟滚动是一种优化长列表性能的技术,其通过按需渲染列表项来提高浏览器运行效率。具体来说,虚拟滚动只渲染用户浏览器视口部分的文档数据,而不是整个文档结构,其核心实现根据可见区域高度和容器的滚动位置计算出需要渲染的列表项,同时不渲染额外的视图内容。虚拟滚动的优势在于可以大大减少DOM操作,从而降低渲染时间和内存占用,解决页面加载慢、卡顿等问题,改善用户体验。
WindRunnerMax
2024/06/04
5430
「前端进阶」高性能渲染十万条数据(虚拟列表)
在工作中,有时会遇到需要一些不能使用分页方式来加载列表数据的业务情况,对于此,我们称这种列表叫做 长列表。比如,在一些外汇交易系统中,前端会实时的展示用户的持仓情况(收益、亏损、收入等),此时对于用户的持仓列表一般是不能分页的。
桃翁
2019/11/05
11K2
「前端进阶」高性能渲染十万条数据(虚拟列表)
虚拟滚动之原理及其封装
前端的业务开发中会遇到一些不分页且数据条数超过1000加载的列表(长列表),不分页的需求在一般前端程序员看来是不可思议的。正常的思考逻辑是,当数据量20w+时,后端报文可去到30+M,查询时间可能去到几十秒。但是前端如果尝试渲染这些数据,花费的时间必定是以分钟计算。通常是3分钟以上。相比之下,由前端优化这个问题更为迫切,责任更为突出(锅更大)。
一粒小麦
2020/07/10
10.1K1
虚拟滚动之原理及其封装
彻底玩转图片懒加载及底层实现原理
图片懒加载其实已经是一个近乎“烂大街”的词语了,在大大小小的面试中也会被频繁的问到,我在之前的面试中也被问到了图片懒加载的原因、实现方式及底层原理,但由于自己平时很少做“图片”相关的处理,对于“懒加载”也是知之甚少,所以在面试中问答的也不是很好。
前端森林
2021/02/03
9940
彻底玩转图片懒加载及底层实现原理
移动端滚动分页解决方案
目前主流的解决方案主要有两个,scroll 和 IntersectionObserver
万少
2025/02/10
2010
移动端滚动分页解决方案
掌握Intersection Observer API,轻松实现实现图片懒加载、元素滚动动画、无限滚动加载等功能
Intersection Observer API 是浏览器提供的一个强大接口,用来异步观察一个元素是否进入(或者离开)另一个元素或视口(viewport)的可视范围。
watermelo37
2025/04/22
1810
掌握Intersection Observer API,轻松实现实现图片懒加载、元素滚动动画、无限滚动加载等功能
大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表
本文是深入浅出 ahooks 源码系列文章的第十八篇,该系列已整理成文档-地址[1]。觉得还不错,给个 star[2] 支持一下哈,Thanks。
GopalFeng
2022/09/23
8610
大家都能看得懂的源码之 ahooks useVirtualList 封装虚拟滚动列表
【JS】322- 手把手教你实现前端惰性加载
在实际的项目开发中,我遇到了一个这样的需求:一个页面模块有很多列表数据展示,每条数据都带有图片,而首次展示的图片只需要不到10张,那么我们还要一次性把所有图片都加载出来吗?显然这是不对的,不仅影响页面渲染速度,还浪费带宽(因为需要对列表进行拖动排序,需加载出全部列表,不能做分页)。我们可以在浏览器滚动到一定的位置的时候进行下载,这也就是们通常所说的惰性加载,技术上现实其中要用的技术就是图片懒加载--到可视区域再加载。
pingan8787
2019/08/20
1K0
【JS】322- 手把手教你实现前端惰性加载
虚拟滚动的 3 种实现方式!
工作中一直有接触大量数据渲染的业务,使用react-window多之又多,所以对虚拟列表有了些浅显的理解。今天,我们就照着react-window的使用方式来实现三种虚拟列表。
zz_jesse
2023/09/11
2.3K0
虚拟滚动的 3 种实现方式!
IntersectionObserver实现虚拟列表初探
前端开发中经常会遇到大数据量列表展示的性能问题,即大数据量一次性展示时前端渲染大量 Dom,触发渲染性能问题,造成初始加载白屏,交互卡顿等。解决这类问题的方案也有很多,使用虚拟列表展示是一个比较常见的解决方案。今天我们来介绍如何使用 IntersectionObserver 这个 API 来自定义实现虚拟列表。
政采云前端团队
2022/12/01
1.5K0
IntersectionObserver实现虚拟列表初探
react虚拟滚动的实现
github地址https://github.com/theanarkh/react-virtual-scroll
theanarkh
2019/12/23
1.7K0
关于虚拟列表,看这一篇就够了
长列表渲染一直以来都是前端比较头疼的一个问题,如果想要在网页中放大量的列表项,纯渲染的话,对于浏览器性能将会是个极大的挑战,会造成滚动卡顿,整体体验非常不好,主要有以下问题:
Jou
2023/04/23
4.2K0
关于虚拟列表,看这一篇就够了
逐步拆解React组件—Lazyload懒加载
在平时开发的时候我们总会遇到长列表,因为本身web在长列表的性能并不是特别好;加之web本身受到网络波动影响特别大,在首屏同时加载过多的内容会导致卡顿不流畅响应速度慢等问题。对此我们常用懒加载机制来进行优化。
gary12138
2022/10/05
1.8K0
vue自定义指令和IntersectionObserver接口,监听元素进入父元素视窗内的实际应用
刚开始直接用的 vue-check-view,但是因为项目是用 electron 开发的桌面应用,布局上需要在列表父盒子上实现滚动。然后想到h5里新出的监听元素是否进入视口的 IntersectionObserver,一看好像可以满足,在借助 vue 的自定义指令来封装成一个自定义指令使用。
人人都是码农
2023/11/17
6430
vue自定义指令和IntersectionObserver接口,监听元素进入父元素视窗内的实际应用
面试官:不会“不定高”虚拟列表,你在简历上面提他干嘛?
欧阳也在找工作,坐标成都求内推,remote也可以。扫描文末的二维码加欧阳好友,还可以加入高质量vue源码交流群,这个群里也有不少面试官。
前端欧阳
2024/12/27
1030
面试官:不会“不定高”虚拟列表,你在简历上面提他干嘛?
长列表优化:用 React 实现虚拟列表
大家好,我是前端西瓜哥。这次我们来看看虚拟列表是什么玩意,并用 React 来实现两种虚拟列表组件。
前端西瓜哥
2022/08/18
4.5K0
长列表优化:用 React 实现虚拟列表
懒加载 React 长页面 - 动态渲染组件
长页面在前端开发中是非常常见的。例如下图中的电商首页,楼层数据来自运营人员在后台的配置,楼层数量是不固定的,同时每个楼层可能会依赖更多翻页数据。在这种情况下,如果一次性将页面全部渲染,可想而知,我们的页面直出效率(fmp, fid)会受到影响。
用户3806669
2021/04/30
3.7K0
懒加载 React 长页面 - 动态渲染组件
[day-ui] Affix 组件学习
固钉组件是把页面某个元素相对页面 HTML 或者某个 dom 内定位显示,例如固定页面顶部/底部显示,页面宽高改变也会保持原位置。如果进行滚动,超过定义的范围就会固定定位,否则会跟随页面滚动
测不准
2021/05/26
1.3K0
小程序长列表优化实践
在一些电商的小程序项目中,长列表是一个很普遍的场景,在加载大量的列表数据的过程中,可能会遇到手机卡顿,白屏等问题。也许数据进行分页处理可以防止一次性加载数据带来的性能影响,但是随着数据量越来越大,还是会让小程序应用越来越卡顿,响应速度越来越慢。这种问题不仅仅在小程序上,在移动端 h5 项目中同样存在。
用户6835371
2022/09/01
2.8K0
小程序长列表优化实践
推荐阅读
相关推荐
前端面试HTML相关(一)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档