問(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"))
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注