تقنية

push في ExitStack: هل تستدعي الدخول عند التسجيل؟

ExitStack.push; own=C(); C.__enter__:enter; C.__exit__:exit; push(own) is own:True; inside:[]; after stack exit:["exit"]
تسجيل فقط.

push تسجل الخروج دون استدعاء الدخول في مثالنا. [1] [2]

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

لا؛ التسجيل لا يستدعي __enter__. [1] [2]

  • push تسجل الخروج دون استدعاء الدخول في مثالنا. [1] [2]
  • على CPython 3.12.14، في الصنف C، __enter__ تسجل "enter" وتعيد "leaf"؛ __exit__ تسجل "exit" وتعيد False. [1] [2]
  • own كائن C جديد؛ push(own) تعيده نفسه، والسجل داخل with فارغ؛ بعد خروج المكدس يحتوي "exit" وحدها. [1] [2]
  • push تسجل __exit__ فقط هنا؛ enter_context تستدعي __enter__ وتسجل الخروج وتعيد نتيجة الدخول. [1] [2]
  • تحكم بكائن جديد: enter_context(control) تعيد "leaf"؛ السجل داخل with هو ["enter"] وبعد الخروج ["enter","exit"]. لا موارد فعلية أو استثناءات في التجربة. [1] [2]

التسجيل

push تسجل الخروج دون استدعاء الدخول في مثالنا. [1] [2]

الصنف

على CPython 3.12.14، في الصنف C، __enter__ تسجل "enter" وتعيد "leaf"؛ __exit__ تسجل "exit" وتعيد False. [1] [2]

بلا دخول

own كائن C جديد؛ push(own) تعيده نفسه، والسجل داخل with فارغ؛ بعد خروج المكدس يحتوي "exit" وحدها. [1] [2]

from contextlib import ExitStack class C: def __init__(self):self.events=[] def __enter__(self):self.events.append("enter");return "leaf" def __exit__(self,*args):self.events.append("exit");return False own=C() with ExitStack() as stack: print(stack.push(own) is own,own.events) print(own.events) [1] [2]

ExitStack.enter_context; control=C(); inside:"leaf",["enter"]; after stack exit:["enter","exit"]
دخول وخروج.

الدخول والتحكم

push تسجل __exit__ فقط هنا؛ enter_context تستدعي __enter__ وتسجل الخروج وتعيد نتيجة الدخول. [1] [2]

control=C() with ExitStack() as stack: print(stack.enter_context(control),control.events) print(control.events) [1] [2]

تحكم بكائن جديد: enter_context(control) تعيد "leaf"؛ السجل داخل with هو ["enter"] وبعد الخروج ["enter","exit"]. لا موارد فعلية أو استثناءات في التجربة. [1] [2]

المراجع

  1. Python ExitStack
  2. CPython contextlib

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

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