Pyanalyze는 Python 코드의 반 정적 유형 검사기입니다. 정적 유형 검사기 (예 : Mypy 또는 Vyright)와 마찬가지로 코드의 유형 오류를 감지하여 생산에 도달하기 전에 버그를 찾을 수 있습니다. 그러나 이러한 도구와 달리, IT 유형 확인 모듈을 가져 와서 Pyanalyze는 다른 유형 체커가 거부 할 많은 동적 구성을 이해할 수있게합니다. 이 속성을 사용하면 코드와 직접 상호 작용하는 플러그인으로 Pyanalyze를 확장 할 수 있습니다.
Pyanalyze를 설치할 수 있습니다.
$ pip install pyanalyze설치되면 Python 파일 또는 패키지에서 Pyanalyze를 실행할 수 있습니다.
$ python -m pyanalyze file.py
$ python -m pyanalyze package/ 그러나 이것은 전달 된 모든 Python 파일을 가져 오려고합니다. if __name__ == "__main__": Blocks, 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를 확장하는 주요 방법 중 하나는 특정 기능에 대한 사양을 제공하는 것입니다. 이를 통해 기능에 대한 인수를 검사하고 무언가 잘못된 경우 오류가 발생하는 임의의 코드를 실행할 수 있습니다.
예를 들어, 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 Typing 사양을 구현하는 것을 목표로하지만 일부 기능에 대한 지원은 불완전합니다. 자세한 내용은 문서를 참조하십시오.
때때로 Pyanalyze는 문제가 발생하여 방출되는 오류를 무시해야합니다. 다음과 같이 수행 할 수 있습니다.
# static analysis: ignore .# static analysis: ignore .# static analysis: ignore . 이것은 전체 파일의 오류를 무시합니다. 특정 오류 코드 만 무시하려면 # static analysis: ignore[undefined_name] 와 같은 오류 코드를 추가 할 수 있습니다. 이것은 전체 파일 무시에 효과가 없습니다. bare_ignore 오류 코드가 켜지면 주석 무시에 오류 코드를 지정하지 않으면 Pyanalyze가 오류가 발생합니다.
Pyanalyze는 현재 표준 # type: ignore .
Pyanalyze는 수명이 끝나지 않은 모든 버전의 파이썬을 지원합니다. 확인한 코드를 가져 오기 때문에 코드를 실행하는 데 사용하는 동일한 버전의 Python을 사용하여 실행해야합니다.
우리는 당신의 기여를 환영합니다. 시작 방법은 Contributing.md를 참조하십시오.
문서는 ReadThedocs 또는 Github에서 제공됩니다.