تقنية

ExitStack في بايثون: هل True من callback تخفي الاستثناء؟

ExitStack; fn returns True; callback(fn); RuntimeError in with; calls=[0]; escaped=True
خطأ ينتشر.

callback لا تكبح خطأنا رغم إرجاع دالتنا True؛ push تكبحه في التحكم. [1] [2]

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

لا؛ طريقة التسجيل تؤثر هنا. [1] [2]

  • callback لا تكبح خطأنا رغم إرجاع دالتنا True؛ push تكبحه في التحكم. [1] [2]
  • في CPython 3.12.14، fn(*args) تسجل عدد الوسائط وتعيد True؛ نرفع RuntimeError داخل with. [1] [2]
  • callback(fn) تستدعيها بلا وسائط في مثالنا؛ تصل المعالجة الخارجية: calls=[0] وescaped=True. [1] [2]
  • غلاف callback يستدعي دالتنا دون إعادة قيمتها؛ الدالة لا تتلقى تفاصيل الاستثناء. [1] [2]
  • تحكم: push(fn) تمرر تفاصيل الاستثناء الثلاثة وتكبحه هنا: calls=[3] وescaped=False؛ دالة متزامنة واحدة فقط. [1] [2]

طريقة التسجيل

callback لا تكبح خطأنا رغم إرجاع دالتنا True؛ push تكبحه في التحكم. [1] [2]

دالة المثال

في CPython 3.12.14، fn(*args) تسجل عدد الوسائط وتعيد True؛ نرفع RuntimeError داخل with. [1] [2]

مع callback

callback(fn) تستدعيها بلا وسائط في مثالنا؛ تصل المعالجة الخارجية: calls=[0] وescaped=True. [1] [2]

from contextlib import ExitStack calls=[] def fn(*args): calls.append(len(args));return True escaped=False try: with ExitStack() as stack: stack.callback(fn) raise RuntimeError("bud") except RuntimeError:escaped=True print(calls,escaped) [1] [2]

ExitStack; fn returns True; push(fn); RuntimeError in with; calls=[3]; escaped=False
خطأ مكبوح.

الغلاف والتحكم

غلاف callback يستدعي دالتنا دون إعادة قيمتها؛ الدالة لا تتلقى تفاصيل الاستثناء. [1] [2]

calls.clear();escaped=False try: with ExitStack() as stack: stack.push(fn) raise RuntimeError("bud") except RuntimeError:escaped=True print(calls,escaped) [1] [2]

تحكم: push(fn) تمرر تفاصيل الاستثناء الثلاثة وتكبحه هنا: calls=[3] وescaped=False؛ دالة متزامنة واحدة فقط. [1] [2]

المراجع

  1. Python ExitStack
  2. CPython ExitStack

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

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