Pyanalyze是Python代碼的半靜態型檢查器。像靜態類型的檢查器(例如,Mypy或Pyright)一樣,它檢測到代碼中的類型錯誤,因此在到達生產之前可以找到錯誤。但是,與此類工具不同,它會導入其鍵入檢查的模塊,從而使Pyanalys可以理解其他類型的檢查器會拒絕的許多動態結構。該屬性還可以通過與代碼直接交互的插件擴展pyanalyze。
您可以使用以下方式安裝pyanalyze
$ pip install pyanalyze安裝後,您可以在Python文件或軟件包上運行pyanalyme,如下:
$ 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來看到它們。重要的包括-f ,它運行了交互式提示,可讓您檢查並修復pyanalyze和--enable / --disable發現的每個錯誤,從而啟用和禁用特定的錯誤代碼。
還支持通過pyproject.toml文件進行配置。有關詳細信息,請參見文檔。
擴展Pyanalyze的主要方法之一是為特定功能提供規範。這使您可以運行任意代碼,該代碼將參數檢查到函數,並在出錯時會引起錯誤。
例如,假設您的代碼庫包含一個函數database.run_query()該函數將作為參數作為sql字符串,諸如此類:
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如果未在ighore評論中指定錯誤代碼,則會發出錯誤。
Pyanalyze當前不支持標準# type: ignore評論語法。
Pyanalyze支持尚未達到壽命的所有版本的Python。因為它導入了它檢查的代碼,因此您必須使用與運行代碼的相同版本的Python進行運行。
我們歡迎您的貢獻。有關如何入門,請參見貢獻。
文檔可在ReadThedocs或Github上找到。