Pyanalyze هو مدقق نوع شبه ثابت لرمز Python. مثل مدقق النوع الثابت (على سبيل المثال ، mypy أو pyright) ، يكتشف أخطاء النوع في الكود الخاص بك بحيث يمكن العثور على الأخطاء قبل أن تصل إلى الإنتاج. على عكس مثل هذه الأدوات ، فإنه يستورد الوحدات النمطية التي تقوم بها بفحص ، مما يتيح تحليلًا للبيان من فهم العديد من التركيبات الديناميكية التي سترفضها مدققون من النوع الآخر. تتيح هذه الخاصية أيضًا تمديد تحليل Pyanalase مع الإضافات التي تتفاعل مباشرة مع الكود الخاص بك.
يمكنك تثبيت Pyanalyze مع:
$ pip install pyanalyzeبمجرد تثبيته ، يمكنك تشغيل Pyanalyze على ملف أو حزمة Python على النحو التالي:
$ python -m pyanalyze file.py
$ python -m pyanalyze package/ لكن لاحظ أن هذا سيحاول استيراد جميع ملفات Python التي يتم تمريرها. إذا كان لديك برامج نصية تؤدي عملياتها دون if __name__ == "__main__": الكتل ، قد ينتهي التحليل pyanalase بتنفيذها.
من أجل التشغيل بنجاح ، يحتاج 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 أيضًا. انظر الوثائق للحصول على التفاصيل.
واحدة من الطرق الرئيسية لتوسيع التحليل pyanse هي من خلال توفير مواصفات لوظيفة معينة. يتيح لك ذلك تشغيل التعليمات البرمجية التعسفية التي تفحص الوسيطات في الوظيفة ورفع الأخطاء إذا كان هناك خطأ ما.
على سبيل المثال ، لنفترض أن قاعدة بياناتك تحتوي على 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 ، ولكن دعم بعض الميزات غير مكتمل. انظر الوثائق للحصول على التفاصيل.
في بعض الأحيان ، يخطئ التحليل في Pyanmate الأمور وتحتاج إلى تجاهل خطأ ينبعث منه. يمكن القيام بذلك على النحو التالي:
# 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.