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)
ちょっと試した範囲ではうまく動作していそう。
背景
Pythonソースコードの文法エラーがあったら、GitHub Actionsで落ちたテストをアノテーションするpytestプラグインでアノテーションしたいという話題があった。
Python 2.7対応を考える場合は文法の互換性に気をつける必要があるので、欲求はよくわかる。一方で、文法エラーがあるモジュールを読み込んだ時点でSyntaxError例外を送出してテストが終了するので、単体ではアノテーションするのが難しいと思う。
ところで、文法エラーがあったら落ちるテストを用意できればプラグインの実装を変えずにリーズナブルに実現できるのではないか、と思って書いた。