مساء الخير أيها الأصدقاء. ونحن مستمرون في زيادة كثافة إطلاق دورات تدريبية جديدة ، ويسعدنا الآن أن نعلن أن الفصول الدراسية في دورة
"مطور الويب في بيثون" ستبدأ في أواخر أبريل. في هذا الصدد ، نشارك تقليديا في ترجمة المواد المفيدة. لنبدأ.
ومن المعروف بيثون لتكون لغة الكتابة الديناميكية. من السهل جدًا كتابة أطر عمل شبيهة بـ DSL يصعب تحليلها باستخدام أدوات فحص الكتابة الثابتة. على الرغم من ذلك ، مع أحدث الابتكارات الوظيفية
لـ mypy ، مثل
البروتوكولات والأنواع الحرفية ، بالإضافة إلى الدعم الأساسي لل metaclasses ودعم الواصفات ، يمكننا في كثير من الأحيان الحصول على أنواع محددة ، ولكن لا يزال من الصعب تجنب الإيجابيات الخاطئة والعوامل السلبية الأخرى. لحل هذه المشكلة وتجنب الحاجة إلى تخصيص نظام الكتابة لكل إطار عمل ، يدعم
mypy نظام
المكونات الإضافية . الإضافات عبارة عن وحدات في Python توفر
روابط إضافية للمكالمات التي
سيتصل بها mypy عند التحقق من أنواع الفئات والوظائف التي تتفاعل مع مكتبة أو إطار عمل. وبالتالي ، من الممكن التمييز بدقة أكبر بين نوع الوظيفة التي يتم إرجاعها ، والتي يصعب للغاية التعبير عنها ، أو إنشاء بعض طرق الفصل تلقائيًا لتعكس تأثيرات الديكور. لمعرفة المزيد حول بنية نظام المكونات الإضافية ومشاهدة القائمة الكاملة للميزات ، راجع
الوثائق .
الإضافات ذات الصلة للمكتبة القياسيةيأتي
Mypy مع مكونات إضافية افتراضية لتنفيذ الوظائف والفئات الأساسية ، بالإضافة إلى
dataclasses
و
dataclasses
و
dataclasses
. ويشمل أيضًا الإضافات
attrs
(كان تاريخياً أول مكون إضافي من طرف ثالث كتب لـ
mypy ). هذه الإضافات تسمح لـ
mypy بتحديد الأنواع بدقة والتحقق من الكود بطريقة صحيحة باستخدام وظائف المكتبة هذه. لإظهار ذلك بمثال ، ألق نظرة على مقتطف الشفرة:
from dataclasses import dataclass from typing import Generic, TypeVar @dataclass class TaggedVector(Generic[T]): data: List[T] tag: str position = TaggedVector([0, 0, 0], 'origin')
أعلاه ، يتم استدعاء
get_class_decorator_hook()
عندما يتم تعريف الفئة. يؤدي ذلك إلى إضافة أساليب تم إنشاؤها تلقائيًا ، بما في ذلك
__init__()
، إلى نص الوظيفة. يستخدم
Mypy مُنشئًا لحساب
TaggedVector[int]
بشكل صحيح كنوع
position
. كما ترى من المثال ، تعمل الإضافات حتى مع الفصول العامة.
إليك جزء آخر من التعليمات البرمجية:
from contextlib import contextmanager @contextmanager def timer(title: str) -> Iterator[float]: ... with timer(9000) as tm: ...
هنا
get_function_hook()
يوفر نوع الإرجاع الدقيق
get_function_hook()
السياق ، لذلك يمكن التحقق من المكالمات إلى الوظيفة المزينة للتأكد من مطابقتها لنوع معين. الآن يمكن
mypy التعرف على الخطأ: يجب أن تكون وسيطة
timer()
سلسلة.
مزيج من الإضافات بذرةبالإضافة إلى استخدام وظائف Python الديناميكية ، غالبًا ما تواجه الأطر مشكلة وجود واجهات برمجة تطبيقات كبيرة. يحتاج
Mypy إلى ملفات
كعب روتين للمكتبات لاختبار التعليمة البرمجية التي تستخدم هذه المكتبات (فقط إذا كانت المكتبة لا تحتوي على تعليقات توضيحية مضمنة ، وهي ليست شائعة جدًا). لا يمثل توزيع
روتين الدعامات للأطر الكبيرة باستخدام
typeshed ممارسة شائعة:
- يحتوي Typeshed على دورة إطلاق بطيئة نسبيًا (يتم شحنها مع mypy ).
- يمكن أن تؤدي الدعامات غير المكتملة إلى مكالمات خاطئة ، والتي سيكون من الصعب للغاية تجنبها.
- لا تخلط بين بذرة الروبيان من الإصدارات المختلفة.
تقوم حزم كعب الروتين المقدمة في
PEP 561 بما يلي:
- يمكن للمطورين إصدار حزم كعب كلما أرادوا.
- لن يرى المستخدمون الذين لم يختاروا استخدام الحزمة إيجابيات خاطئة.
- يمكنك بأمان تثبيت إصدارات عشوائية من العديد من حزم كعب الروتين المختلفة.
علاوة على ذلك ، يتيح لك
pip
إمكانية الجمع بين مختلف الروتين للمكتبات والإضافات
mypy المقابلة في توزيع واحد. يمكن بسهولة تطوير
الدعامات لإطار
mypy أو المكون الإضافي المقابل ووضعها معاً في توزيع واحد ، وهو أمر مفيد للغاية لأن الإضافات تملأ تعريفات مفقودة أو غير دقيقة في بذرة.
أحدث مثال على مثل هذه الحزمة هو
كعب الروتين SQLAlchemy والمكون الإضافي ، مع أول إصدار عام للإصدار 0.1 ، الذي تم نشره منذ بعض الوقت على PyPI. على الرغم من حقيقة أن هذا المشروع في الإصدار ألفا المبكر ، يمكننا استخدامه بأمان في DropBox لتحسين فحص الكتابة. البرنامج المساعد يفهم تصريحات ORM الأساسية:
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String)
في مقتطف الشفرة أعلاه ، يستخدم المكون الإضافي
get_dynamic_class_hook()
لإخبار
mypy بأن Base عبارة عن فئة أساسية صالحة ، حتى لو لم تكن تبدو كذلك. ثم يتم استدعاء
get_base_class_hook()
لتعريف المستخدم ، ويضيف العديد من السمات التي تم إنشاؤها تلقائيًا. بعد ذلك ، نقوم بإنشاء مثيل للنموذج:
user = User(id=42, name=42)
get_function_hook()
استدعاء
get_function_hook()
، لذلك قد يشير
mypy إلى خطأ: يتم تلقي قيمة
integer
بدلاً من اسم المستخدم.
يعرّف الروتين
Column
بأنه واصف
عام ، بحيث تحصل سمات النموذج على الأنواع الصحيحة:
id_col = User.id
نحن نرحب بـ PRS التي تضيف أنواعًا أكثر دقة إلى كعب الرهانات (يتم تتبع التقدم المحرز في الوحدات الأساسية
هنا ).
فيما يلي بعض المآثر التي اكتشفناها أثناء العمل على المقابس:
- استخدم
__getattr__()
لتفادي الإيجابيات الخاطئة في المراحل المبكرة عندما لا تكتمل الدعامات (هذا يمنع أخطاء mypy إذا كانت سمات الوحدة النمطية مفقودة). يمكنك أيضًا استخدام هذا في ملفات __init__.py
في حالة فقد أي وحدات فرعية. - غالبًا ما تساعد الواصفات في تعريفات النوع الأكثر دقة للوصول إلى السمة المخصصة (كما في مثال العمود الذي استعرضناه أعلاه). يعد استخدام الواصفات جيدًا حتى إذا كان التنفيذ الفعلي لوقت التشغيل يستخدم آلية أكثر تعقيدًا ، بما في ذلك علامة التعريف ، على سبيل المثال.
- دون تردد ، أعلن أن فئات إطار العمل معممة. على الرغم من حقيقة أنها ليست كذلك في وقت التشغيل ، تتيح لك هذه التقنية تحديد نوع بعض عناصر الإطار بدقة أكبر ، بينما يمكن التحايل على أخطاء وقت التشغيل بسهولة. (نأمل أن تضيف الأطر تدريجياً دعمًا مدمجًا للأنواع العامة ، مع وراثة الفئات المقابلة بشكل صريح من
typing.Generic
. typing.Generic
).
الإضافات mypy صدر مؤخراهناك بالفعل العديد من الإضافات المتاحة لأطر بيثون الشعبية. بصرف النظر عن المكوّن الإضافي
SQLAlchemy المذكور أعلاه ، تشتمل حزم نماذج أخرى جديرة بالملاحظة مع
كعب الروتين والمكوّن الإضافي المدمج
mypy على أدوات روتين لواجهتي Django و
Zope . العمل النشط قيد التنفيذ في هذه المشاريع.
تثبيت وتوصيل حزم كعب المساعد واستخدم pip لتثبيت حزمة البرنامج المساعد لـ
mypy و / أو كعب الروتين في بيئة افتراضية حيث
تم بالفعل
تثبيت mypy :
$ pip install sqlalchemy-stubs
سيكتشف Mypy تلقائيًا بذرة مثبتة. لتوصيل المكونات الإضافية المثبتة ، قم بتضمينها مباشرةً في mypy.ini (أو في ملف تكوين المستخدم):
[mypy] plugins = sqlmypy, mypy_django_plugin.main
تطوير الإضافات
mypy وكتابة بذرة
إذا كنت ترغب في تطوير حزمة من أدوات الروتين والإضافات للإطار الذي تستخدمه ، فيمكننا استخدام
مستودع sqlalchemy-stubs كقالب. ويشمل
setup.py
، واختبار البنية التحتية باستخدام اختبارات تعتمد على البيانات ، ومثال على فئة المكونات الإضافية مع مجموعة من السنانير للمكون الإضافي (hooks plugin). نوصي باستخدام
stubgen لإنشاء الروتين تلقائيًا الذي يأتي مع
mypy لبدء استخدامه. لقد تحسن
Stubgen
mypy 0.670
في
mypy 0.670
.
تحقق من
الوثائق إذا كنت تريد معرفة المزيد عن
نظام البرنامج المساعد
mypy . يمكنك أيضًا البحث في الإنترنت عن رموز مصدر المكونات الإضافية التي تمت مناقشتها في المقالة. إذا كانت لديك أسئلة ، فيمكنك طرحها
هنا .
سيكون يوم 15 أبريل عبارة عن
ندوة عبر الإنترنت مفتوحة مجانًا في الدورة ، والتي ستعقد من قِبل أحد منظمي مجتمع بيثون موسكو -
فلاديمير فيلونوف ، اشترك ، وسيكون أمرًا مثيرًا للاهتمام. ونحن الآن في انتظار تعليقاتكم على المواد المترجمة.