تقنية

contextmanager في بايثون: هل تستقبل الكتلة yield الثانية؟

الكتلة تسجل bud مرة واحدة.
كتلة واحدة.

مولد contextmanager يجب أن يقدم قيمة واحدة؛ yield الثانية تخالف العقد. [1]

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

لا؛ with ليست حلقة على القيم. [1]

  • مولد contextmanager يجب أن يقدم قيمة واحدة؛ yield الثانية تخالف العقد. [1]
  • على CPython 3.12.14، twice تقدم bud ثم leaf؛ seen سجل الكتلة. [1]
  • الدخول يربط bud بـvalue؛ الكتلة تنفذ مرة واحدة وseen تحوي bud فقط. [1]
  • الخروج يستأنف المولد؛ yield الثانية تسبب RuntimeError: generator didn't stop هنا، دون تكرار الكتلة. [1]
  • تحكم once تقدم bud ثم تنتهي؛ control تسجلها والخروج عادي. مثال متزامن بلا موارد. [1]

قيمة واحدة

مولد contextmanager يجب أن يقدم قيمة واحدة؛ yield الثانية تخالف العقد. [1]

مولد المثال

على CPython 3.12.14، twice تقدم bud ثم leaf؛ seen سجل الكتلة. [1]

الدخول والكتلة

الدخول يربط bud بـvalue؛ الكتلة تنفذ مرة واحدة وseen تحوي bud فقط. [1]

from contextlib import contextmanager @contextmanager def twice(): yield "bud" yield "leaf" seen=[] try: with twice() as value: seen.append(value) except RuntimeError as exc: print(type(exc).__name__,str(exc)) print(seen) [1]

yield الثانية: RuntimeError عند الخروج.
خروج خاطئ.

الخروج والتحكم

الخروج يستأنف المولد؛ yield الثانية تسبب RuntimeError: generator didn't stop هنا، دون تكرار الكتلة. [1]

@contextmanager def once(): yield "bud" control=[] with once() as value: control.append(value) print(control) [1]

تحكم once تقدم bud ثم تنتهي؛ control تسجلها والخروج عادي. مثال متزامن بلا موارد. [1]

المراجع

  1. Python contextmanager

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

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