تقنية

enter_context في بايثون: هل تكفي دوال على المثيل؟

ExitStack.enter_context; class Node:pass; own=Node(); own.__enter__:callable; own.__exit__:callable; type(own):no __enter__/__exit__; TypeError; events:[]
دوال المثيل.

دوال المثيل وحدها لا تكفي في مثال enter_context. [2]

الخلاصة السريعة

لا؛ يرفضها مثالنا بخطأ TypeError. [1] [2]

  • دوال المثيل وحدها لا تكفي في مثال enter_context. [2]
  • على CPython 3.12.14، own كائن Node بلا دوال سياق في صنفه؛ نضع __enter__ و__exit__ قابلتين للاستدعاء على الكائن. [2]
  • stack.enter_context(own) ترفع TypeError؛ events تبقى فارغة، فلا تُستدعى دالة الدخول المسندة. [1] [2]
  • التنفيذ المثبت يقرأ cls=type(cm)، ثم cls.__enter__ وcls.__exit__ قبل استدعاء الدخول؛ سمات المثيل لا تحقق ذلك هنا. [2]
  • تحكم مستقل: C تعرف الدالتين في الصنف؛ الدخول يعيد "leaf"، والخروج يسجل "exit". مثال متزامن بلا موارد فعلية؛ لا يعمم سلوك الواصفات. [1] [2]

البروتوكول

دوال المثيل وحدها لا تكفي في مثال enter_context. [2]

سمات المثيل

على CPython 3.12.14، own كائن Node بلا دوال سياق في صنفه؛ نضع __enter__ و__exit__ قابلتين للاستدعاء على الكائن. [2]

رفض الدخول

stack.enter_context(own) ترفع TypeError؛ events تبقى فارغة، فلا تُستدعى دالة الدخول المسندة. [1] [2]

from contextlib import ExitStack class Node:pass own=Node();events=[] own.__enter__=lambda:events.append("enter") own.__exit__=lambda *args:False try: with ExitStack() as stack:stack.enter_context(own) except TypeError:print("TypeError",events) [1] [2]

ExitStack.enter_context; class C defines __enter__/__exit__; control=C(); __enter__:"leaf"; stack exit; events:["exit"]
دوال الصنف.

الصنف والتحكم

التنفيذ المثبت يقرأ cls=type(cm)، ثم cls.__enter__ وcls.__exit__ قبل استدعاء الدخول؛ سمات المثيل لا تحقق ذلك هنا. [2]

class C: def __enter__(self):return "leaf" def __exit__(self,*args):events.append("exit");return False control=C();events=[] with ExitStack() as stack:print(stack.enter_context(control)) print(events) [1] [2]

تحكم مستقل: C تعرف الدالتين في الصنف؛ الدخول يعيد "leaf"، والخروج يسجل "exit". مثال متزامن بلا موارد فعلية؛ لا يعمم سلوك الواصفات. [1] [2]

المراجع

  1. Python enter_context
  2. CPython contextlib

للتوسع: لغات البرمجة.

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