Augument Python 3 أشجار بناء الجملة المجردة (ASTS) مع معلومات النوع الثابت.
Python هي لغة برمجة مطبوعة ديناميكيًا. ومع ذلك ، فإن الكثير من كود بيثون الذي شوهد عادة سيعمل حتى لو تم كتابته بشكل ثابت!
مع هذه الحزمة ، يمكن للمرء إدراج معلومات النوع الثابت في أشجار بناء الجملة المجردة في Python (ASTS) ، لذلك بافتراض أن الكود المعطى سيعمل إذا تم كتابة Python بشكل ثابت ، يمكن للمرء أن يفكر في الأنواع في الكود بشكل ثابت ، قبل التنفيذ.
مثل هذا AST المعزز مخصص بشكل أساسي للتحليل/الاستهلاك باستخدام أدوات أخرى.
يعمل بشكل أفضل مع ASTS من وحدة typed_ast ، ومع ذلك فهو يعمل أيضًا مع وحدة ast المدمجة.
ننصح أن هذا عمل مستمر ، والتنفيذ الحالي يخضع لتغييرات مفاجئة.
سيتم إسقاط دعم typed_ast بعد إصدار Python 3.8 ، حيث سيتم دمج وظائفها في محلل AST المدمج.
محتويات
يمكنك استخدام الوحدة static_typing لتحليل الكود مباشرة باستخدام وظيفة parse() :
import static_typing as st
class MyClass :
pass
module = st . parse ( 'def my_fun(obj: MyClass) -> MyClass: return obj' )
# TODO: currently there is no public API yet
functions = module . _functions
my_fun = module . _functions [ 'my_fun' ]
assert MyClass in my_fun . _params [ 'obj' ] أو يمكنك زيادة AST الحالية باستخدام وظيفة augment() :
import static_typing as st
import typed_ast . ast3
module = typed_ast . ast3 . parse ( '''def spam(): x, y, z = 'ham', 42, 3.1415 # type: str, int, float''' )
module = st . augment ( module )
# TODO: currently there is no public API yet
function = module . _functions [ 'spam' ]
assert len ( function . _local_vars ) == 3
assert float in function . _local_vars [ 'z' ]لمزيد من الأمثلة ، انظر أمثلة.
بالإضافة إلى الميزات الرئيسية ، تحتوي المكتبة على وحدة static_typing.ast_manipulation التي تحتوي على أدوات منخفضة المستوى وبنات بناء تسمح بـ:
typed_ast إلى ast المدمج والعكس بالعكس) و العملية أو الكتابة الثابتة ، والتي تنفذها وظيفة augment() لها 3 خطوات رئيسية:
في جميع العقد المعمول بها ، يتم تخزين تلميحات الكتابة في الحقول type_comment ، annotation returns . يقرأ نوع تلميح نوع تلميح تلك الحقول - التي هي إما سلاسل أوس أو asts.
يستخدم جداول الرموز Python المقدمة لحل تلميحات النوع في كائنات النوع الفعلي باستخدام الاستبطان.
بشكل افتراضي ، يستخدم Resolver الرموز المدمجة فقط عند استدعاءها مباشرة أو من خلال augment() . ومع ذلك ، عند استدعاء parse() فإنه يستخدم globals() والسكان locals() من المتصل بشكل افتراضي.
يتم تخزين تلميحات النوع التي تم حلها مباشرة في AST. على وجه التحديد ، يتم تخزين كل حقل تم حله في حقل مسمّن مقابلًا ، والذي يتم حله إما resolved_type_comment أو resolved_annotation أو resolved_returns .
وبالتالي ، تصبح المعلومات الثابتة متوفرة في AST.
لكل عقدة AST التي قد تحتوي على أي إعلانات الاسم ، يتم توفير نسخة مالية من العقدة. تحتوي كل عقدة AST الممتدة على حقول جديدة تخزن تلك الأسماء المعلنة وتكتب المعلومات المرتبطة بكل اسم.
تقوم هذه الحقول الجديدة بتخزين جميع المعلومات من جميع التلميحات التي تم حلها في أي نطاق محلي ، بحيث يمكن اكتشاف نوع تعارض أو نقص معلومات النوع. أيضًا ، بناءً على هذه المعلومات المشتركة ، يمكن تنفيذ الاستدلال النوع.
على وجه التحديد ، يتم توفير إصدارات جديدة من العقد التالية AST مع حقول جديدة: Module النمطية ، FunctionDef ، ClassDef ، Assign ، AnnAssign With For هذه الإصدارات الجديدة لها أسمائها مسبوقة StaticallyTyped...
قائمة الكيانات التي يتم جمع المعلومات من أجلها في تلك الحقول الجديدة.
Module :
FunctionDef :
لـ ClassDef :
Assign و AnnAssign :
For :
With :
تعني إعادة كتابة AST استبدال العقد AST العادية المذكورة أعلاه مع إصداراتها الممتدة.
Python الإصدار 3.5 أو أحدث.
مكتبات بيثون كما هو محدد في المتطلبات.
يتطلب إنشاء اختبارات وتشغيلها بالإضافة إلى ذلك حزم مدرجة في test_requirement.txt.
تم اختباره على Linux و Windows.