دوال المثيل وحدها لا تكفي في مثال 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"]](https://images.bahralolom.com/assets/local-2000-20261012/BA-1722/python-enter-context-type-values.png)
الصنف والتحكم
التنفيذ المثبت يقرأ 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]
المراجع
للتوسع: لغات البرمجة.
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
![ExitStack.enter_context; class Node:pass; own=Node(); own.__enter__:callable; own.__exit__:callable; type(own):no __enter__/__exit__; TypeError; events:[]](https://images.bahralolom.com/assets/local-2000-20261012/BA-1722/python-enter-context-type-main.png)