web-dev-qa-db-ja.com

Pythonコメントとdocstringを除く)のコード行を数える方法は?

マルチファイルPythonプロジェクトのコード行をできるだけ正確にカウントしたいのですが、コメント、docstring、または空白行を合計に含めません。

私は最初に、Debianパッケージとして入手可能なclocを使用してみました。ただし、clocは、コメントであっても、ほとんどのdocstringをコードとして扱います。 (更新:ではなくなりました-最近のバージョンのclocはPython docstringsをコメントとして扱うようになりました。)

Docstringは、実行時の動作に影響を与えるためにコードによって使用される可能性があり、したがってプログラムcode/data/configの一部としてカウントされる可能性があるため、合計に含める必要があるというコメントが以下にあります。この顕著な例は「ply」です。これは、私が覚えているように、プログラムの操作の中心となる文法と正規表現を含むdocstringを使用して関数を作成するように要求します。しかし、これは非常にまれな例外のように思えます。ほとんどの場合、docstringはコメントのように機能します。具体的には、測定したいすべてのコードに当てはまるという事実を知っています。そのため、行数からそれらを除外したいと思います。

20
Ingo Fischer

Python docstringsを「コード行」カウントに含めるのはおそらく正しいでしょう。通常、コメントはコンパイラーによって破棄されますが、docstringsは解析されます。

PEP 257-Docstring規則 を参照してください:

Docstringは、モジュール、関数、クラス、またはメソッド定義の最初のステートメントとして出現する文字列リテラルです。このようなdocstringは、そのオブジェクトの__doc__特殊属性になります。

.。

発生する文字列リテラルelsewhere in Pythonコードはドキュメントとしても機能する可能性があります。それらはPythonバイトコードによって認識されませんコンパイラそしてランタイムオブジェクト属性としてアクセスできません。

言い換えると、docstringコンパイルされ、非常に現実的な方法でプログラムのコードを構成します。さらに、これらは一般的に doctest module ユニットテスト、コマンドラインユーティリティの使用文字列などで使用されます。

6
Hamish

コメント行は、Pythonのコード行にすることができます。たとえば、doctestを参照してください。

さらに、このようなケースをコメントまたはコードと見なすための賢明で信頼できる方法を見つけるのに苦労するでしょう。

foo = ('spam', 
       '''eggs
          eggs
          eggs'''
       '''more spam''',
       'spam')

コメント行も数えるだけです。ほとんどのプログラマーは、実際に測定しようとしているものすべてに対して、それが適切な測定であることに同意すると思います。

6
wim

Tahar docstringをカウントしません。これがそのcount_loc関数です:

def count_loc(lines):
    nb_lines  = 0
    docstring = False
    for line in lines:
        line = line.strip()

        if line == "" \
           or line.startswith("#") \
           or docstring and not (line.startswith('"""') or line.startswith("'''"))\
           or (line.startswith("'''") and line.endswith("'''") and len(line) >3)  \
           or (line.startswith('"""') and line.endswith('"""') and len(line) >3) :
            continue

        # this is either a starting or ending docstring
        Elif line.startswith('"""') or line.startswith("'''"):
            docstring = not docstring
            continue

        else:
            nb_lines += 1

    return nb_lines
4
ychaouche

http://www.ohloh.net/p/ohcount -私はPythonを使用していませんが、常にかなりのお金を払っています。

2
Adrian Cornish