مولد 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: 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]
المراجع
للتوسع: لغات البرمجة.
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
