Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

مساعدات نوع بيثون 3، وتحليل ثابت

by
Difficulty:IntermediateLength:LongLanguages:

Arabic (العربية/عربي) translation by osamagaradh (you can also view the original English article)

3.5 بيثون عرض الوحدة النمطية الكتابية الجديدة التي توفر دعم مكتبة قياسي للاستفادة من شروح الدالة للحصول على مساعدات بنوع اختياري. التي تفتح الباب لأدوات جديدة ومثيرة للاهتمام لتحقق من نوع ثابت مثل ميبي، وفي المستقبل ربما تحسين على أساس نوع آلي  . يتم تحديد نوع المساعدات في بيب-483 و 484 بيب.

في هذا البرنامج التعليمي أنا استكشف الاحتمالات التي يكون فيها ذلك النوع من المساعدات حاضرة وساظهر لك كيفية استخدام ميبي لتحليل برامج بيثون الخاصة بك بشكل ثابت، وإلى حد كبير تحسين جودة التعليمات البرمجية الخاصة بك.

مساعدات النوع

تلميحات(مساعدات) النوع مبنية على رأس توضيحيات الدالة بإيجاز، شروح-توضيحات- الدالة تتيح لك إضافة توضيح للحجج، وإرجاع قيمة من دالة أو أسلوب مع بيانات وصفية تعسفية. تلميحات النوع هي حالة خاصة من شروح الدالة التي على وجه التحديد تشرح حجج الدالة وقيمة الإرجاع مع معلومات نوع قياسية. توضيحات الدالة بشكل عام وتلميحات النوع خاصة هي اختيارية تماما. دعونا نلقي نظرة على مثال سريع:

كانت الحجج مشروحة مع النوع الخاص بهم، فضلا عن قيمة الإرجاع. ولكن من المهم ادرك أن بيثون يتجاهل هذا تماما. فإنه يجعل نوع المعلومات المتاحة عن طريق سمة الشروح لكائن الدالة، لكن هذا عنه.

للتحقق من أن بيثون حقاً يتجاهل تلميحات النوع، دعونا تماما نلخبط تلميحات النوع:

كما ترى، سلوك التعليمات البرمجية هو نفسه، بغض النظر عن نوع التلميحات.

دافع للحصول على تلميحات النوع

حسننا. تلميحات النوع اختيارية. يتم تجاهل تلميحات النوع تماما بواسطة بايثون. ما هو الهدف منها،اذا؟ حسنا، هناك عدة أسباب وجيهة:

  • تحليل ثابت
  • دعم IDE
  • التوثيق القياسي

أنا سوف اغوص في تحليل ثابت مع ميبي في وقت لاحق. IDE بدأت بالفعل بدعم بيتشارم 5 للحصول على تلميحات النوع . يعتبر التوثيق القياسي أمرًا رائعًا للمطورين الذي يمكنه بسهولة معرفة نوع الحجج وقيمة الإرجاع فقط من خلال النظر إلى توقيع الدالة وكذلك مولدات الوثائق الآلية التي يمكنها استخراج معلومات النوع من التلميحات

وحدة الكتابة

تحتوي وحدة الكتابة على أنواع مصممة لدعم تلميحات النوع. لماذا لا نستخدم ببساطة انواع بايثون مثيرة مثل int و str و list و dict؟  يمكنك بالتأكيد استخدام هذه الأنواع ، ولكن بسبب الكتابة الديناميكية لـ Python ، بتجاوز الأنواع الأساسية انت لا تحصل على الكثير من المعلومات على سبيل المثال ، إذا كنت تريد تحديد أن الحجة قد تكون تناظر بين سلسلة وعدد صحيح ، فلا توجد طريقة لفعل ذلك باستخدام أنواع بايثون القياسية مع وحدة الكتابة، يعتبر سهل كما :

لننظر إلى مثال أكثر اكتمالًا: دالة تأخذ حجتين.  واحدة منها عبارة عن قائمة من القواميس حيث يحتوي كل قاموس على مفاتيح هي سلاسل وقيم من الاعداد الصحيحة.  أما الحجة الأخرى فهي إما سلسلة أو عدد صحيح تتيح وحدة الكتابة مواصفات دقيقة لمثل هذه الحجج المعقدة

انواع مفيدة

 لنرى بعض الأنواع الأكثر إثارة للاهتمام من وحدة الكتابة

 يسمح لك نوع Callable بتحديد الدالة التي قد يتم تمريرها كحجج أو إعادتها كنتيجة ، نظرًا لأن Python تتعامل مع الوظائف مثل: مواطنين من الدرجة الأولى. إن بناء الجمل للمعالجات هو توفير مصفوفة من أنواع الحجج (مرة أخرى من وحدة الكتابة) متبوعة بقيمة إرجاع. إذا كان هذا مربك، إليك مثال:

 يتم تحديد دالة رد الاتصال on_error كدالة تأخذ استثناءًا وعددًا صحيحًا كحجج ولاتعيد أي شيء.

يعني الأي نوع أن مدقق الكتابة الثابت يجب أن يسمح بأي عملية بالإضافة إلى التخصيص لأي نوع آخر كل نوع هو نوع فرعي من أي.

يعتبر نوع الاتحاد الذي رأيته سابقًا مفيدًا عندما يمكن أن تحتوي الحجة على أنواع متعددة ، وهو أمر شائع جدًا في Python. في المثال التالي ، تقبل الدالة verify_config () حجة تكوين ، والتي يمكن أن تكون إما كائن تكوين أو اسم ملف. إذا كان اسم ملف ، فإنه يستدعي دالة أخرى لتحليل الملف إلى كائن تهيئة وإعادته.

النوع الاختياري يعني أن الحجة قد تكون بلا أيضًا. Optional[T] يساوي Union[T, None]

هناك العديد من الأنواع الأخرى التي تشير إلى إمكانيات مختلفة مثل Iterable و Iterator و Reversible و SupportsInt و SupportsFloat و Sequence و MutableSequence و IO تحقق من وثائق وحدة الكتابة للحصول على القائمة الكاملة.

الشيء الرئيسي هو أنه يمكنك تحديد نوع من الحجج بطريقة مزاجية تدعم نظام نوع بايثون في دقة عالية وتسمح للعوام وفئات القواعد المجردة.

مراجع متقدمة

في بعض الأحيان تريد الإشارة إلى تلميح فئة في نوع داخل أحد الأساليب الخاصة به.  على سبيل المثال ، لنفترض أن الفئة أ يمكنها تنفيذ عملية دمج تأخذ مثيل آخر من A ، تدمجها مع نفسها وتقوم بإرجاع النتيجة. إليك محاولة ساذجة لاستخدام تلميحات الكتابة لتحديدها

ماذا حدث؟ لم يتم تعريف الفئة A حتى الآن عند تحديد تلميح الكتابة لطريقة دمجها () بواسطة Python ، لذلك لا يمكن استخدام الفئة A في هذه المرحلة (مباشرة). الحل بسيط للغاية ، وقد رأيته مستخدمًا من قبل SQLAlchemy أنت فقط تحدد تلميح الكتابة كسلسلة سيفهم Python أنه مرجع إلى الأمام وسيفعل الشيء الصحيح

ادخل اسماء مستعارة

أحد الجوانب السلبية لاستخدام تلميحات الكتابة لمواصفات الكتابة الطويلة هو أنه يمكنها أن تفسد الشفرة وتجعلها أقل قابلية للقراءة ، حتى إذا كانت توفر الكثير من معلومات النوع. كما يمكنك استخدام أسماء مستعارة تمامًا مثل أي كائن آخر انه ببساطة ك:

دالة get_type_hints() المساعدة

توفر وحدة الكتابة دالة get_type_hints ( )، والتي توفر معلومات حول أنواع الحجج وقيمة الإرجاع. بينما تقوم سمة التوضيحات بإرجاع تلميحات الكتابة لأنها مجرد تعليقات توضيحية ، ما زلت أنصحك باستخدام الدالة get_type_hints () لأنها تحل مراجع متقدمة أيضاً ، إذا قمت بتحديد الافتراضي من -بلا- إلى إحدى الحجج ، ستقوم الدالة get_type_hints () بإرجاع نوعها تلقائيًا كـ Union [T، NoneType] إذا كنت قد حددت T فقط. دعنا نرى الفرق باستخدام طريقة A.merge () المحددة في وقت سابق:

تعيد سمة التعليقات التوضيحية ببساطة قيمة التعليق التوضيحي كما هي  ففي هذه الحالة ، تكون السلسلة "A" فقط وليست كائن الفئة "أ" ، وحيث تكون "A" لها مجرد  مرجع إلى الأمام.

حولت الدالة get_type_hints () النوع من الحجة الآخرى إلى اتحاد من A (الفئة) و NoneType بسبب الحجة الافتراضية بلا تم تحويل نوع الإرجاع أيضًا إلى الفئة A

الديكورات

تعد تلميحات الكتابة تخصصًا للتعليقات التوضيحية للدالة ، ويمكنها أيضًا العمل جنبًا إلى جنب مع التعليقات التوضيحية الأخرى للدالة.

ولتنفيذ ذلك ، توفر الوحدة النمطية الكتابية ديكورين:no_type_check وno_type_check_decorator. يمكن تطبيق ديكورno_type_check على أي فئة أو دالة. تضيف السمة no_type_check إلى الوظيفة (أو كل طريقة للفئة). بهذه الطريقة ، سيعرف المدققون أنهم ليتجاهلوا التعليقات التوضيحية التي لا تمثل تلميحات كتابة.

إنه أمر مرهق بعض الشيء لأنه إذا قمت بكتابة مكتبة سيتم استخدامها على نطاق واسع ، يجب أن تفترض أنه سيتم استخدام مدقق الكتابة ، وإذا كنت ترغب في إضافة تعليقات توضيحية إلى دوالك باستخدام تلميحات غير كتابية ، فيجب عليك أيضًا تزيينها بـ @ no_type_check.

من السيناريوهات الشائعة عند استخدام التعليقات التوضيحية الوظيفية المعتادة أيضًا أن يكون لها ديكور يعمل عليها. أنت أيضا تريد إيقاف التحقق من النوع في هذه الحالة. خيار واحد هو استخدام الديكورno_type_check@ بالإضافة إلى الديكور الخاص بك ، ولكن هذا يصبح قديم. بإمكانك استخدام no_Type_check_decorator@ لتزيين الديكور الخاص بك بحيث يتصرف أيضًا مثل no_type_check@ (يضيف السمة no_type_check@).

اسمحوا لي أن أبين جميع هذه المفاهيم.  إذا حاولت إلى get_type_hint () (كما سيفعل أي نوع مدقق) في دالة موضحة بتعليق توضيحي عادي للسلسلة ، سيقوم get_type_hints () بتفسيرها كمرجع إلى الأمام:

لتجنب ذلك ، أضف decorno_pepe_check@ ، و get_type_hints ببساطة تعيد عبارة فارغة ، بينما ترجع السمة __annotations__ التعليقات التوضيحية:

الآن ، لنفترض أن لدينا مصممًا للديكور يقوم بطباعة التعليقات التوضيحية. يمكنك تزيينها بـno_Type_check_decorator@ ثم قم بتزيين الدالة وعدم القلق بشأن نوع المدقق الذي يتصل get_type_hints () فتتشوش.  من المحتمل أن يكون هذا أفضل الممارسات لكل ديكور يعمل على التعليقات التوضيحية لا تنس @ functools.wraps ، وإلا لن يتم نسخ التعليقات التوضيحية إلى الوظيفة المزخرفة وسيفكك كل شيء.  يتم تناول هذا بالتفصيل في التعليقات التوضيحية لدالة Python 3.

الآن ، يمكنك تزيين الوظيفة فقط باستخدام print_annotations@ ، وكلما تمت استدعاءه سيقوم بطباعة تعليقاته التوضيحية.

كما أن استدعاء get_type_hints () آمن أيضًا ويعيد dict فارغة.

تحليل ثابت مع ميبي

Mypy هو مدقق من نوع ثابت كان مصدر إلهام تلميحات الكتابة ووحدة الكتابة. جويدو فان روسوم نفسه هو مؤلف PEP-483 ومؤلف مشارك في PEP-484

تثبيت ميبي

Mypy في تطور نشط جدًا، واعتبارًا من كتابة هذه السطور ، أصبحت الحزمة على PyPI قديمة ولا تعمل مع Python 3.5 لاستخدام Mypy مع Python 3.5 ، احصل على أحدث إصدار من مستودع Mypy على GitHub. انه ببساطة كما:

اللعب مع ميبي

بمجرد تثبيت Mypy، يمكنك فقط تشغيل Mypy على برامجك  يحدد البرنامج التالي دالة تتوقع قائمة من السلاسل.  ثم يقوم باستدعاء الدالة بقائمة من الأعداد الصحيحة

 عند تشغيل البرنامج ، من الواضح أنه يفشل في وقت التشغيل مع الخطأ التالي

ما هي المشكلة في ذلك؟ المشكلة ليست واضحة على الفور حتى في هذه الحالة البسيطة للغاية لما هو السبب الجذري. هل هي مشكلة في نوع الإدخال؟ أو ربما تكون الشيفرة نفسها خاطئة ويجب ألا تحاول استدعاء الطريقة السفلية () على كائن "int".  وهناك قضية أخرى هي أنه إذا لم يكن لديك تغطية اختبار 100٪ (ولنكن صادقين ،لا أحد منا لديه) ، ثم يمكن أن تكمن مثل هذه القضايا في بعض مسار الشفرة غير المختبرة ونادرا ما يتم اكتشافها في أسوأ وقت في الإنتاج.

كتابة ثابتة ، بمساعدة تلميحات الكتابة ، تمنحك شبكة أمان إضافية من خلال التأكد من أنك تتصل دائمًا بدوالك (مشروح مع تلميحات الكتابة) مع الأنواع الصحيحة. هنا هو إخراج ميبي:

وهذا أمر بسيط ، يشير مباشرة إلى المشكلة ، ولا يتطلب تشغيل الكثير من الاختبارات المزايا الأخرى من التحقق من نوع ثابت هو أنه إذا التزمت بها ، يمكنك تخطي التحقق من النوع الديناميكي إلا عند تحليل المدخلات الخارجية (ملفات القراءة أو طلبات الشبكة الواردة أو إدخال المستخدم) كما أنه يبني الكثير من الثقة فيما كلما تقدم البناء

الاستنتاج

تعتبر تلميحات الكتابة ووحدة الكتابة عبارة عن إضافات اختيارية تمامًا للتعبير عن بيثون على الرغم من أنها قد لا تناسب ذوق الجميع ، بالنسبة للمشروعات الكبيرة والفرق الكبيرة التي يمكن أن تكون لا غنى عنها والدليل هو أن الفرق الكبيرة تستخدم بالفعل التحقق من النوع الثابت الآن بما ان هذا النوع من المعلومات موحد، سيكون من السهل مشاركة التعليمات البرمجية والأدوات التي تستخدمها. IDEs مثل PyCharm تستغلها بالفعل لتقديم تجربة أفضل للمطورين

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.