有許多工具可以計算程式中代碼的源代碼行數。我目前使用cloc. 我經常使用它作為衡量我正在從事的專案的復雜性的代理,偶爾會花幾個星期來盡量減少這個衡量標準。但是,它并不理想,因為它會受到變數名長度等因素的影響。
有沒有一種簡單的方法,也許通過利用 python 解釋器/AST 決議器本身的位,來計算 Python 程式中不同標記的數量?例如:
grammar = grammar_path.read_text(encoding="UTF-8")
getattr()如果我們算上賦值運算子的第二個引數,這一行可能有 6 個標記。
我希望在某個地方有這個的實作,我只是不知道要用谷歌搜索什么才能找到它。了解是否有任何現有工具可以用其他語言執行此操作也會很有幫助。
uj5u.com熱心網友回復:
該行grammar = grammar_path.read_text(encoding="UTF-8")有 10 個標記,如果計算NEWLINE行尾的標記,則為 11 個。您可以很容易地看到,使用內置標準庫模塊中的generate_tokens方法。tokenize(雖然我在下面的示例中使用 v3.11,但該tokenize模型從 v2.2 開始可用。不過,生成的令牌的詳細資訊有所更改。)
請注意,generate_token 方法期望它的引數是一個迭代輸入行的函式。為了進行簡單演示,我只使用sys.stdin.readline,它從 中讀取連續的行stdin。更正常的用法是提供readline打開檔案以供閱讀的方法。我enumerate在示例中使用是為了對連續的標記進行編號。
$ python3.11
Python 3.11.0 (main, Oct 24 2022, 19:56:01) [GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tokenize
>>> import sys
>>> for i, token in enumerate(tokenize.generate_tokens(sys.stdin.readline), start=1):
... print(f"""{i:3}: {token}""")
...
grammar = grammar_path.read_text(encoding="UTF-8")
1: TokenInfo(type=1 (NAME), string='grammar', start=(1, 0), end=(1, 7), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
2: TokenInfo(type=54 (OP), string='=', start=(1, 8), end=(1, 9), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
3: TokenInfo(type=1 (NAME), string='grammar_path', start=(1, 10), end=(1, 22), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
4: TokenInfo(type=54 (OP), string='.', start=(1, 22), end=(1, 23), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
5: TokenInfo(type=1 (NAME), string='read_text', start=(1, 23), end=(1, 32), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
6: TokenInfo(type=54 (OP), string='(', start=(1, 32), end=(1, 33), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
7: TokenInfo(type=1 (NAME), string='encoding', start=(1, 33), end=(1, 41), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
8: TokenInfo(type=54 (OP), string='=', start=(1, 41), end=(1, 42), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
9: TokenInfo(type=3 (STRING), string='"UTF-8"', start=(1, 42), end=(1, 49), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
10: TokenInfo(type=54 (OP), string=')', start=(1, 49), end=(1, 50), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
11: TokenInfo(type=4 (NEWLINE), string='\n', start=(1, 50), end=(1, 51), line='grammar = grammar_path.read_text(encoding="UTF-8")\n')
此時,回圈正在等待下一行;為了終止回圈,我需要鍵入一個輸入結束標記(Unix 上的 Control-D;Windows 上的 Control-Z;在這兩種情況下,后跟 Enter)。然后分詞器將回傳一個最終的ENDMARKER令牌:
12: TokenInfo(type=0 (ENDMARKER), string='', start=(2, 0), end=(2, 0), line='')
如檔案中所述,您還可以使用標準庫模塊作為命令列實用程式來列出令牌。同樣,我必須通過鍵入輸入結束標記來終止輸入,然后列印最后一行:
$ python3.11 -m tokenize
grammar = grammar_path.read_text(encoding="UTF-8")
1,0-1,7: NAME 'grammar'
1,8-1,9: OP '='
1,10-1,22: NAME 'grammar_path'
1,22-1,23: OP '.'
1,23-1,32: NAME 'read_text'
1,32-1,33: OP '('
1,33-1,41: NAME 'encoding'
1,41-1,42: OP '='
1,42-1,49: STRING '"UTF-8"'
1,49-1,50: OP ')'
1,50-1,51: NEWLINE '\n'
2,0-2,0: ENDMARKER ''
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/536687.html
