تقنية

redirect_stdout في بايثون: هل يبقى التوجيه بعد الخطأ؟

sys.stdout is saved تعطي True بعد الخطأ.
استعادة التيار.

redirect_stdout تستعيد التيار السابق عند الخروج بعد الخطأ في مثالنا. [1] [2]

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

لا هنا؛ sys.stdout تعود إلى saved. [1] [2]

  • redirect_stdout تستعيد التيار السابق عند الخروج بعد الخطأ في مثالنا. [1] [2]
  • على CPython 3.12.14، نحفظ sys.stdout؛ نوجه print إلى StringIO ثم نرفع ValueError. [1] [2]
  • بعد الخروج، sys.stdout is saved تعطي True؛ buffer.closed تعطي False والنص bud مع نهاية سطر. [1] [2]
  • ValueError تصل إلى except الخارجية؛ استعادة التوجيه لا تخفي الخطأ هنا. [1] [2]
  • تحكم بخروج عادي يلتقط leaf ويستعيد التيار أيضًا. التغيير عالمي؛ التجربة بلا خيوط أو عمليات فرعية. [1] [2]

توجيه مؤقت

redirect_stdout تستعيد التيار السابق عند الخروج بعد الخطأ في مثالنا. [1] [2]

تيار المثال

على CPython 3.12.14، نحفظ sys.stdout؛ نوجه print إلى StringIO ثم نرفع ValueError. [1] [2]

الاستعادة والمخزن

بعد الخروج، sys.stdout is saved تعطي True؛ buffer.closed تعطي False والنص bud مع نهاية سطر. [1] [2]

from contextlib import redirect_stdout from io import StringIO import sys saved=sys.stdout;buffer=StringIO() try: with redirect_stdout(buffer): print("bud") raise ValueError("bud") except ValueError: print(sys.stdout is saved) print(buffer.closed,repr(buffer.getvalue())) [1] [2]

buffer.closed تعطي False.
المخزن مفتوح.

الخطأ والتحكم

ValueError تصل إلى except الخارجية؛ استعادة التوجيه لا تخفي الخطأ هنا. [1] [2]

control=StringIO() with redirect_stdout(control): print("leaf") print(sys.stdout is saved,repr(control.getvalue())) [1] [2]

تحكم بخروج عادي يلتقط leaf ويستعيد التيار أيضًا. التغيير عالمي؛ التجربة بلا خيوط أو عمليات فرعية. [1] [2]

المراجع

  1. Python redirect_stdout
  2. CPython 3.12.14 contextlib

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

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