国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

使用Python設(shè)計(jì)一個(gè)代碼統(tǒng)計(jì)工具

2020-02-22 23:36:31
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

問(wèn)題

設(shè)計(jì)一個(gè)程序,用于統(tǒng)計(jì)一個(gè)項(xiàng)目中的代碼行數(shù),包括文件個(gè)數(shù),代碼行數(shù),注釋行數(shù),空行行數(shù)。盡量設(shè)計(jì)靈活一點(diǎn)可以通過(guò)輸入不同參數(shù)來(lái)統(tǒng)計(jì)不同語(yǔ)言的項(xiàng)目,例如:

# type用于指定文件類(lèi)型python counter.py --type python

輸出:

files:10
code_lines:200
comments:100
blanks:20

分析

這是一個(gè)看起來(lái)很簡(jiǎn)單,但做起來(lái)有點(diǎn)復(fù)雜的設(shè)計(jì)題,我們可以把問(wèn)題化小,只要能正確統(tǒng)計(jì)一個(gè)文件的代碼行數(shù),那么統(tǒng)計(jì)一個(gè)目錄也不成問(wèn)題,其中最復(fù)雜的就是關(guān)于多行注釋?zhuān)?Python 為例,注釋代碼行有如下幾種情況:

1、井號(hào)開(kāi)頭的單行注釋

# 單行注釋

2、多行注釋符在同一行的情況

"""這是多行注釋"""
'''這也是多行注釋'''
3、多行注釋符

"""
這3行都是注釋符
"""

我們的思路采取逐行解析的方式,多行注釋需要一個(gè)額外的標(biāo)識(shí)符in_multi_comment 來(lái)標(biāo)識(shí)當(dāng)前行是不是處于多行注釋符當(dāng)中,默認(rèn)為 False,多行注釋開(kāi)始時(shí),置為 True,遇到下一個(gè)多行注釋符時(shí)置為 False。從多行注釋開(kāi)始符號(hào)直到下一個(gè)結(jié)束符號(hào)之間的代碼都應(yīng)該屬于注釋行。

知識(shí)點(diǎn)

如何正確讀取文件,讀出的文件當(dāng)字符串處理時(shí),字符串的常用方法

簡(jiǎn)化版

我們逐步進(jìn)行迭代,先實(shí)現(xiàn)一個(gè)簡(jiǎn)化版程序,只統(tǒng)計(jì)Python代碼的單文件,而且不考慮多行注釋的情況,這是任何入門(mén) Python 的人都能實(shí)現(xiàn)的功能。關(guān)鍵地方是把每一行讀出來(lái)之后,先用 strip() 方法把字符串兩邊的空格、回車(chē)去掉

# -*- coding: utf-8 -*-"""只能統(tǒng)計(jì)單行注釋的py文件"""def parse(path): comments = 0 blanks = 0 codes = 0 with open(path, encoding='utf-8') as f: for line in f.readlines():  line = line.strip()  if line == "":  blanks += 1  elif line.startswith("#"):  comments += 1  else:  codes += 1 return {"comments": comments, "blanks": blanks, "codes": codes}if __name__ == '__main__': print(parse("xxx.py"))

多行注釋版

如果只能統(tǒng)計(jì)單行注釋的代碼,意義并不大,要解決多行注釋的統(tǒng)計(jì)才能算是一個(gè)真正的代碼統(tǒng)計(jì)器

# -*- coding: utf-8 -*-"""

可以統(tǒng)計(jì)包含有多行注釋的py文件

"""def parse(path): in_multi_comment = False # 多行注釋符標(biāo)識(shí)符號(hào) comments = 0 blanks = 0 codes = 0 with open(path, encoding="utf-8") as f: for line in f.readlines():  line = line.strip()  # 多行注釋中的空行當(dāng)做注釋處理  if line == "" and not in_multi_comment:  blanks += 1  # 注釋有4種  # 1. # 井號(hào)開(kāi)頭的單行注釋  # 2. 多行注釋符在同一行的情況  # 3. 多行注釋符之間的行  elif line.startswith("#") or /    (line.startswith('"""') and line.endswith('"""') and len(line)) > 3 or /   (line.startswith("'''") and line.endswith("'''") and len(line) > 3) or /   (in_multi_comment and not (line.startswith('"""') or line.startswith("'''"))):  comments += 1  # 4. 多行注釋符的開(kāi)始行和結(jié)束行  elif line.startswith('"""') or line.startswith("'''"):  in_multi_comment = not in_multi_comment  comments += 1  else:  codes += 1 return {"comments": comments, "blanks": blanks, "codes": codes}if __name__ == '__main__': print(parse("xxx.py"))            
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 栾城县| 子洲县| 福贡县| 芦溪县| 汽车| 隆昌县| 明水县| 涿鹿县| 钟祥市| 天水市| 会昌县| 加查县| 仪陇县| 巫山县| 辉县市| 东丰县| 壶关县| 拜泉县| 舟曲县| 威宁| 罗平县| 夏津县| 永寿县| 五常市| 漯河市| 施甸县| 阳高县| 瑞昌市| 招远市| 沅江市| 彝良县| 延川县| 思茅市| 新兴县| 大渡口区| 光泽县| 日土县| 巫山县| 屯门区| 谷城县| 班戈县|