Pyanalyze เป็นตัวตรวจสอบประเภทกึ่งคงที่สำหรับรหัส Python เช่นเดียวกับตัวตรวจสอบชนิดคงที่ (เช่น mypy หรือ pyright) มันตรวจพบข้อผิดพลาดประเภทในรหัสของคุณเพื่อให้สามารถพบข้อบกพร่องก่อนที่จะถึงการผลิต อย่างไรก็ตามแตกต่างจากเครื่องมือดังกล่าวนำเข้าการตรวจสอบประเภทโมดูลที่ทำให้ Pyanalyze เข้าใจการสร้างแบบไดนามิกจำนวนมากที่ตัวตรวจสอบประเภทอื่นจะปฏิเสธ คุณสมบัตินี้ยังทำให้สามารถขยาย pyanalyze ด้วยปลั๊กอินที่โต้ตอบโดยตรงกับรหัสของคุณ
คุณสามารถติดตั้ง pyanalyze ด้วย:
$ pip install pyanalyzeเมื่อติดตั้งแล้วคุณสามารถเรียกใช้ pyanalyze บนไฟล์ Python หรือแพ็คเกจดังนี้:
$ python -m pyanalyze file.py
$ python -m pyanalyze package/ แต่โปรดทราบว่าสิ่งนี้จะพยายามนำเข้าไฟล์ Python ทั้งหมดที่ผ่านมา หากคุณมีสคริปต์ที่ดำเนินการโดยไม่ต้อง if __name__ == "__main__": บล็อก, pyanaleze อาจจบลงด้วยการดำเนินการ
เพื่อให้ทำงานได้สำเร็จ Pyanalyze จะต้องสามารถนำเข้ารหัสที่ตรวจสอบได้ ในการทำงานนี้คุณอาจต้องปรับเส้นทางการนำเข้าของ Python ด้วยตนเองโดยใช้ตัวแปรสภาพแวดล้อม $PYTHONPATH
สำหรับการทดลองอย่างรวดเร็วคุณสามารถใช้ตัวเลือก -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() ที่ใช้เป็นอาร์กิวเมนต์ SQL String เช่นนี้:
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 จะปล่อยข้อผิดพลาดหากคุณไม่ได้ระบุรหัสข้อผิดพลาดในความคิดเห็นที่ละเว้น
Pyanalyze ไม่สนับสนุนมาตรฐาน # type: ignore ไวยากรณ์ความคิดเห็น
Pyanalyze รองรับ Python ทุกรุ่นที่ยังไม่ถึงจุดจบของชีวิต เนื่องจากนำเข้ารหัสที่ตรวจสอบคุณต้องเรียกใช้โดยใช้ Python เวอร์ชันเดียวกันที่คุณใช้เพื่อเรียกใช้รหัสของคุณ
เรายินดีต้อนรับการมีส่วนร่วมของคุณ ดูการสนับสนุน. MD สำหรับวิธีการเริ่มต้น
เอกสารมีอยู่ที่ ReadtheDocs หรือบน GitHub