Pyanalyzeは、Pythonコード用の半静的タイプチェッカーです。静的タイプのチェッカー(MyPyやPyrightなど)のように、コードのタイプエラーを検出して、生産に到達する前にバグを見つけることができます。ただし、このようなツールとは異なり、タイプチェックのモジュールをインポートするため、他のタイプチェッカーが拒否する多くの動的な構成要素をPyanalyzeが理解できるようにします。このプロパティにより、コードと直接対話するプラグインでピアナリゼを拡張することもできます。
Pyanalyzeを次のようにインストールできます。
$ pip install pyanalyzeインストールされたら、次のようにPythonファイルまたはパッケージでPyanalyzeを実行できます。
$ python -m pyanalyze file.py
$ python -m pyanalyze package/ただし、これにより渡されるすべてのPythonファイルをインポートしようとすることに注意してください。 if __name__ == "__main__":操作を実行するスクリプトがある場合、ブロックすると、pyanalyzeが実行される可能性があります。
正常に実行するには、Pyanalyzeがチェックするコードをインポートできる必要があります。この作業を行うには、 $PYTHONPATH環境変数を使用してPythonのインポートパスを手動で調整する必要がある場合があります。
迅速な実験のために、 -cオプションを使用して、コードを直接チェックすることもできます。
$ python -m pyanalyze -c 'import typing; typing.reveal_type(1)'
Runtime type is 'int'
Revealed type is 'Literal[1]' (code: reveal_type)
In <code> at line 1
1: import typing; typing.reveal_type(1)
^
Pyanalyzeには多くのコマンドラインオプションがあります。これは、 python -m pyanalyze --help実行することで確認できます。重要なものには、pyanalyzeによって見つかった各エラーを調べて修正できるインタラクティブなプロンプトを実行する-fと、特定のエラーコードを有効にして無効にする--enable / --disableを実行できる-fが含まれます。
pyproject.tomlファイルを介した構成もサポートされています。詳細については、ドキュメントを参照してください。
Pyanalyzeを拡張する主な方法の1つは、特定の関数の仕様を提供することです。これにより、関数の引数を検査し、何かが間違っている場合にエラーを発生させる任意のコードを実行できます。
例として、CodeBaseが関数database.run_query()を含むと仮定します。
database . run_query ( "SELECT answer, question FROM content" ) run_query()への呼び出しが構文的に無効なSQLを含むか、存在しないテーブルまたは列を参照するかを検出する必要があります。次のようなコードでそれを設定できます:
from pyanalyze . error_code import ErrorCode
from pyanalyze . signature import CallContext , Signature , SigParameter
from pyanalyze . value import KnownValue , TypedValue , AnyValue , AnySource , Value
from database import run_query , parse_sql
def run_query_impl ( ctx : CallContext ) -> Value :
sql = ctx . vars [ "sql" ]
if not isinstance ( sql , KnownValue ) or not isinstance ( sql . val , str ):
ctx . show_error (
"Argument to run_query() must be a string literal" ,
ErrorCode . incompatible_call ,
)
return AnyValue ( AnySource . error )
try :
parsed = parse_sql ( sql )
except ValueError as e :
ctx . show_error (
f"Invalid sql passed to run_query(): { e } " ,
ErrorCode . incompatible_call ,
)
return AnyValue ( AnySource . error )
# check that the parsed SQL is valid...
# pyanalyze will use this as the inferred return type for the function
return TypedValue ( list )
# in pyproject.toml, set:
# known_signatures = ["<module>.get_known_argspecs"]
def get_known_argspecs ( arg_spec_cache ):
return {
# This infers the parameter types and names from the function signature
run_query : arg_spec_cache . get_argspec (
run_query , impl = run_query_impl
),
# You can also write the signature manually
run_query : Signature . make (
[ SigParameter ( "sql" , annotation = TypedValue ( str ))],
callable = run_query ,
impl = run_query_impl ,
),
}Pyanalyzeは一般に、Pythonタイピング仕様を実装することを目指していますが、一部の機能のサポートは不完全です。詳細については、ドキュメントを参照してください。
Pyanalyzeが物事を間違えることがあり、それが発するエラーを無視する必要があります。これは次のように行うことができます:
# static analysis: ignore 。# static analysis: ignore 。# static analysis: ignore 。これにより、ファイル全体のエラーが無視されます。 # static analysis: ignore[undefined_name]などのエラーコードを追加して、特定のエラーコードのみを無視できます。これは、ファイル全体の無視では機能しません。 bare_ignoreエラーコードがオンになっている場合、Pyanalyzeは、Ingroreコメントでエラーコードを指定しないとエラーを発します。
Pyanalyzeは現在、標準# type: ignore 。
Pyanalyzeは、終末期に到達していないPythonのすべてのバージョンをサポートしています。チェックするコードをインポートするため、コードを実行するために使用する同じバージョンのPythonを使用して実行する必要があります。
貢献を歓迎します。開始方法については、Convinting.mdを参照してください。
ドキュメントは、readthedocsまたはgithubで入手できます。