14

私のバックグラウンドはCとC++です。私はPythonが大好きですが、コンパイル言語に慣れていると、Python(および私が推測する他のインタプリタ言語)の1つの側面を操作するのが非常に困難です。

Pythonで何かを書き、それを実行できるようになったときでも、言語固有のエラーが残っていないという保証はありません。私にとっては、クラッシュを回避するためにランタイム防御(入力、アサートなどの厳密なテスト)だけに頼ることはできないことを意味します。6か月後に、他の点では優れたコードが最終的に実行されると、愚かなタイプミスのためにクラックが発生する可能性があるためです。 。

明らかに、すべてのコードが実行されたことを確認するためにシステムを十分にテストする必要がありますが、ほとんどの場合、社内のスクリプトや小さなツールにPythonを使用しています。もちろん、必要なQAの注意を引くことはありません。また、一部のコードは非常に単純であるため(バックグラウンドがC / C ++の場合)、コンパイルする限り正常に機能することがわかります(たとえば、クラス内のgetterメソッド、通常はメンバー変数の単純な戻り値)。

だから、私の質問は明白です-Pythonスクリプトのすべてのコードが「コンパイル」されて実行されることを確認できる方法はありますか(特別なツールなどを使用して)?

4

5 に答える 5

21

PyCheckerPyLintを見てください。

ささいなプログラムから得られたpylintからの出力例を次に示します。

print a

ご覧のとおり、py_compileが(意図的に)検出しない未定義の変数を検出します。

in foo.py:

************* Module foo
C:  1: Black listed name "foo"
C:  1: Missing docstring
E:  1: Undefined variable 'a'


...

|error      |1      |1        |=          |

「すべての行」をカバーしている場合でも、テストが十分ではない理由の簡単な例:

bar = "Foo"
foo = "Bar"
def baz(X):
    return bar if X else fo0

print baz(input("True or False: "))

編集:PyCheckerは私のために三元を処理します:

Processing ternary...
True or False: True
Foo

Warnings...

ternary.py:6: No global (fo0) found
ternary.py:8: Using input() is a security problem, consider using raw_input()
于 2009-06-22T12:39:34.323 に答える
2

他の人は、PyLint のような非常に優れたツールについて言及していますが、一長一短は、100% 実行することは不可能だということです。実際、やりたくないかもしれません。Python の動的性のメリットの 1 つは、辞書アクセスを介してローカル スコープに名前を挿入するなど、クレイジーなことを実行できることです。

つまり、コンパイル時に型エラーをキャッチする方法が必要な場合は、Python を使用すべきではないということです。言語の選択には、常に一連のトレードオフが伴います。C ではなく Python を選択した場合は、強力な型システムと引き換えに、開発の高速化や文字列操作の改善などを行っていることに注意してください。

于 2009-06-30T03:26:18.470 に答える
1

あなたが探しているのは、コードテストラインのカバレッジだと思います。スクリプトにテストを追加して、コードのすべての行、または時間のある限り多くの行がテストされることを確認します。テストは大変な作業ですが、求めている種類の保証が必要な場合は、無料のランチはありません。申し訳ありません:(。

于 2009-06-22T12:39:25.773 に答える
1

EclipseとPydevをIDEとして使用している場合は、多くのタイプミスにすぐに赤い波線でフラグを立てることができ、Pylintも統合されています。例えば:

foo = 5
print food

「未定義の変数:食品」としてフラグが付けられます。もちろん、これは常に正確であるとは限りません(おそらく、食べ物はsetattrまたは他のエキゾチックな手法を使用して以前に定義されていました)が、ほとんどの場合うまく機能します。

一般に、コードを静的に分析できるのは、コードが実際に静的である場合に限られます。コードが動的であるほど、自動テストが本当に必要になります。

于 2009-06-22T13:09:00.613 に答える
0

コードは実際に実行するとコンパイルされます。コードに構文エラーがあると、Python ランタイムは文句を言います。C/C++ や Java などの静的にコンパイルされた言語と比較して、変数の名前と型が正しいかどうかはチェックされません。そのため、実際にコードを実行する必要があります (自動テストなどを使用)。

于 2009-06-22T12:49:04.053 に答える