私が歌川です

@utgwkk が書いている

Pythonソースコードの文法チェックを行うテストを書く

src ディレクトリ以下のPythonソースコードの文法チェックを行いたい。テストとして回せるとよさそう。

pytestを使って書くならこういう感じになりそう。Python 2.7対応のためにglob2ライブラリを使っているけど、Python 3.5以降なら標準のglobモジュールで事足りる。

py_compileはPythonソースコードをバイトコードにコンパイルする組み込みモジュールだけど、コンパイルする際に文法エラーがあったらコンパイル失敗するので、これを活用できないだろうか、というアイデア。

from glob2 import iglob
import py_compile
import pytest

python_files = iglob('src/**/*.py', recursive=True)

@pytest.mark.parametrize("path", python_files)
def test_syntax(path):
    try:
        py_compile.compile(path, doraise=True)
    except py_compile.PyCompileError as ex:
        pytest.fail(ex.msg)

ちょっと試した範囲ではうまく動作していそう。

github.com

gyazo.com

背景

Pythonソースコードの文法エラーがあったら、GitHub Actionsで落ちたテストをアノテーションするpytestプラグインでアノテーションしたいという話題があった。

github.com

Python 2.7対応を考える場合は文法の互換性に気をつける必要があるので、欲求はよくわかる。一方で、文法エラーがあるモジュールを読み込んだ時点でSyntaxError例外を送出してテストが終了するので、単体ではアノテーションするのが難しいと思う。

ところで、文法エラーがあったら落ちるテストを用意できればプラグインの実装を変えずにリーズナブルに実現できるのではないか、と思って書いた。