البرمجة

فهم Protocols في بايثون: Duck Typing الجديدة

في عالم لغة البرمجة بايثون، يظهر لنا جانب مثير للاهتمام عندما نتعامل مع الوحدة الجديدة المُضافة إلى اللغة والتي تُدعى “typing”، والتي تأتي مع مفاهيم جديدة تُعرف بالـ Protocols. وفي هذا السياق، يظهر رفض استخدام الدالة isinstance() مع Protocols، وهو ما يثير تساؤلات حول طبيعة هذه الـ Protocols والأسباب التي تجعل استخدام isinstance() معها غير مسموح.

في بداية الأمر، يُدرج الوثائق الخاصة بالوحدة “typing” أنواعًا مثل “SupportsInt” و “SupportsFloat” و “SupportsBytes”، ويمكن أن يتساءل المبرمج عن إمكانية استخدام isinstance() لفحص ما إذا كانت الكائنات تدعم مثلاً __int__() أم لا. ولكن هنا يظهر السلوك المُثير، حيث يُرفض استخدام isinstance() ويُرمى TypeError بمفاده أن “Protocols cannot be used with isinstance()”.

هنا يتنبه المبرمج إلى أن هناك مصطلحًا جديدًا يُطلق عليه اسم “protocol”، وهو مفتاح الفهم لهذا السلوك الغير متوقع. في سياق لغة البرمجة بايثون، يُفهم البروتوكول (Protocol) كمجموعة من السلوكيات أو الطرق التي يجب أن يتبعها كائن ما ليُعتبر متوافقًا مع هذا البروتوكول. ومن الجدير بالذكر أن هذه الفكرة لا تأتي من برمجة الكائنات التقليدية، ولكنها تعزز فكرة “duck typing” أو التحقق من الصفات بدلاً من التحقق من الأنواع.

باختصار، البروتوكول هو عبارة عن تعريف لسلوك معين يجب أن يتبعه الكائن ليكون متوافقًا مع هذا البروتوكول. وعلى ذلك، يعتبر استخدام isinstance() مع Protocols خاطئًا، لأن هذا الأخير ليس كائنًا بل هو مجرد تعريف لسلوك. في المقابل، يُسمح باستخدام issubclass() لفحص ما إذا كان نوع الكائن ينسجم مع البروتوكول أو لا.

في الختام، يظهر أن تفهم البروتوكولات في بايثون يعزز فهمًا أعمق لمبادئ “duck typing” وكيفية تفاعل اللغة مع التصميم الشائع في البرمجة الحديثة.

المزيد من المعلومات

تُعد فهم Protocols في لغة البرمجة بايثون أمرًا أساسيًا للمبرمجين الذين يرغبون في استفادة من قوة هذه الميزة. Protocols تُضيف طبقة جديدة من التعامل مع الأنواع في بايثون، حيث يتم التحقق من الصفات (behavior) بدلاً من التحقق من الأنواع (types).

  1. تعريف Protocols:
    Protocols هي واجهات (interfaces) تحدد السلوك المتوقع لكائن ما دون التحديد الصارم للأنواع. تحتوي Protocols على مجموعة من الطرق (methods) أو الصفات (attributes) التي يجب أن يتبعها الكائن ليكون متوافقًا مع هذا البروتوكول.

  2. استخدام isinstance() و issubclass() مع Protocols:

    • isinstance() لا تُستخدم مع Protocols لأن الأخيرة ليست كائنات يمكن فحصها بشكل مباشر.
    • issubclass() تُستخدم لفحص ما إذا كان نوع الكائن يتبع البروتوكول أو لا.
  3. طريقة تعريف Protocols:
    يمكن تعريف Protocols باستخدام علامة Protocol في وحدة الـ typing. على سبيل المثال:

    python
    from typing import Protocol class SupportsInt(Protocol): def __int__(self) -> int: pass

    في هذا المثال، يُعرف SupportsInt كبروتوكول يحتوي على طريقة __int__().

  4. فائدة Protocols:

    • تُمكن المبرمجين من تعريف واجهات دون الحاجة إلى تحديد الأنواع بشكل صارم.
    • تعزز فلسفة “duck typing”، حيث يتم تحديد الكائن بناءً على سلوكه بدلاً من نوعه.
  5. استخدام Protocols مع متغيرات:
    يمكن استخدام Protocols مع متغيرات لتحديد أنواع الكائنات التي تتوافق مع السلوك المحدد. على سبيل المثال:

    python
    def process_number(value: SupportsInt) -> None: result = int(value) # يتأكد التحليل الضمني من توافق الكائن مع SupportsInt # قم بتنفيذ المزيد من العمليات...

فهم Protocols يفتح أفقًا جديدًا في فهم لغة البرمجة بايثون، وتقديم هذه الميزة تعكس التزام المجتمع البرمجي بتعزيز المرونة والبساطة في التصميم.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!