ホームページ > バックエンド開発 > Python チュートリアル > Python を使用してコード統計ツールを設計する

Python を使用してコード統計ツールを設計する

不言
リリース: 2018-04-04 16:57:57
オリジナル
1462 人が閲覧しました

この記事では、ファイル数、コード行数、コメント行数、空白行数など、Python を使用したコード統計ツールの設計に関する関連情報を主に紹介します。興味のある方は、Script House のエディターをフォローしてご覧ください

質問

ファイルの数、コードの行数を含む、プロジェクト内のコードの行数をカウントするプログラムを設計してください、コメント行の数、空白行の数。さまざまなパラメータを入力して、さまざまな言語のプロジェクトをカウントすることで、設計をより柔軟にしてください。たとえば、次のようになります。

分析

これは非常に単純そうに見える設計の問題ですが、ファイル内のコードの行数を正しく数えることができれば、問題を小さくすることができます。その中で、最も複雑なのは、複数行のコメントです。Python を例に挙げると、コメント コード行には次のような状況があります。シャープ記号


# 単一行のコメント

2. 同じ行に複数行のコメント 状況

"""これは複数行のコメントです"""'''これも複数行のコメントです'''3. 複数行のコメント文字"""

これらの 3 行はすべてコメント文字です

"""

私たちのアイデアは、複数行のコメントを識別するために追加の識別子 in_multi_comment を必要とすることです。現在の行が複数行コメント内にあるかどうか。デフォルトは False で、複数行コメントが開始されると、次の複数行コメント文字に到達すると True に設定されます。複数行コメントの開始記号と次の終了記号の間のコードは、コメント行に属している必要があります。


知識ポイント


ファイルを正しく読み取る方法、ファイルを読み取る際の文字列処理の一般的な方法


簡易バージョン

段階的に繰り返し、最初に簡略化を実装しますこのバージョンのプログラムPython コードの単一ファイルのみをカウントし、複数行のコメントは考慮されません。これは、Python を初めて使用する人でも実現できる機能です。重要な点は、各行を読み取った後、最初にstrip()メソッドを使用して文字列の両側のスペースと改行を削除することです。このコードは、複数行のコメントの統計のみを考慮する必要があります。実際のコード統計学者は、複数行のコメントを含む py ファイルをカウントできます

# type用于指定文件类型
python counter.py --type python
ログイン後にコピー

この場合、複数行のコメント記号に遭遇したときの重要な操作は次のとおりです。 in_multi_comment 識別子を単純に False または True に設定するのではなく、反転します。最初に """ に遭遇したときは True になり、2 回目に """ に遭遇したときは複数行のコメントの終了文字です。否定は False などです。3 回目は始まりで、その否定は再び True になります。

では、他の言語で解析関数を書き直す必要があるかどうかを判断するには?よく観察すると、ほとんどの言語には単行コメントと複数行コメントがありますが、その記号が異なるため、複数行コメントの 4 つの状況は 4 つの判断条件を抽象化できます。

# -*- coding: utf-8 -*-
"""
只能统计单行注释的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"))
ログイン後にコピー

cond1 から cond4 に対応する、すべての言語で単一行コメントと複数行コメントのシンボルをマークするために必要な構成定数は 1 つだけです。残りのタスクは複数のファイルを解析することです。これは os.walk メソッドを使用して実行できます。

# -*- coding: utf-8 -*-
"""
ログイン後にコピー

もちろん、コマンドラインの解析や、指定されたパラメータに基づいて特定の言語のみを解析するなど、このプログラムを完成させるにはやるべきことがまだたくさんあります。

補足:

コード行数カウントツールのPython実装

プロジェクト内のコードの行数をカウントしたいことがよくありますが、より完全なカウント機能が必要な場合は、それほど単純ではないかもしれません。今日は Python を使用してコードライン統計ツールを実装する方法について説明しましょう。

アイデア:

最初にすべてのファイルを取得し、次に各ファイルのコードの行数を数え、最後に行数を追加します。

実装された関数:

行数を数えます。各ファイル内の行数をカウントします。

実行時間をカウントします。

サブディレクトリを含むファイルの行数を再帰的にカウントします。ファイル;

空白行を除外します。

"""
def parse(path):
 in_multi_comment = False # 多行注释符标识符号
 comments = 0
 blanks = 0
 codes = 0
 with open(path, encoding="utf-8") as f:
 for line in f.readlines():
  line = line.strip()
  # 多行注释中的空行当做注释处理
  if line == "" and not in_multi_comment:
  blanks += 1
  # 注释有4种
  # 1. # 井号开头的单行注释
  # 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. 多行注释符的开始行和结束行
  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"))
ログイン後にコピー

結果:

[root@pythontab script]# python countCodeLine.py /root/script/test/gametest.php---- 16

/root/script/smtp.php ---- 284

/root/script/gametest.php---- 16

/root/script/countCodeLine.py---- 33

/root/script/sendmail .php---- 17/root /script/test/gametest.php---- 16 総行数: 382

完了! コスト時間: 0.00 秒

[root@pythontab script]#

のみphp と python ファイルをカウントできるので、非常に便利です。

関連する推奨事項:

Python 設計電卓関数実装の完全な例の共有

Python 設計パターン プログラミングにおけるビジターおよびオブザーバー パターンの例の紹介


以上がPython を使用してコード統計ツールを設計するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート