إعادة توجيه الدفق السياقي في بايثون
أثبتت إعادة توجيه المخرجات القياسية وتدفقات الأخطاء (stdout و stderr) أنها مفيدة في العديد من السيناريوهات. ومع ذلك، غالبًا ما تفشل الطرق التقليدية عندما تحتوي الوظيفة على مرجع داخلي لهذه التدفقات.
الحاجة إلى حل ديناميكي
تقنيات إعادة التوجيه التقليدية، مثل sys.stdout، إعادة توجيه التدفقات بشكل دائم. تنشأ هذه المشكلة عندما تقوم إحدى الطرق بنسخ أحد هذه المتغيرات داخليًا. وبالتالي، تفشل هذه الأساليب في إعادة توجيه التدفقات بشكل صحيح.
الحل: ملحق مدير السياق
لمعالجة هذه المشكلة بشكل فعال، يمكن استخدام نهج مدير السياق. تتضمن هذه الطريقة تغليف منطق إعادة التوجيه داخل مدير السياق:import os
import sys
class RedirectStdStreams(object):
def __init__(self, stdout=None, stderr=None):
self._stdout = stdout or sys.stdout
self._stderr = stderr or sys.stderr
def __enter__(self):
self.old_stdout, self.old_stderr = sys.stdout, sys.stderr
self.old_stdout.flush(); self.old_stderr.flush()
sys.stdout, sys.stderr = self._stdout, self._stderr
def __exit__(self, exc_type, exc_value, traceback):
self._stdout.flush(); self._stderr.flush()
sys.stdout = self.old_stdout
sys.stderr = self.old_stderr
باستخدام مدير السياق هذا، يمكنك إعادة توجيه التدفقات بسلاسة داخل كتلة السياق:devnull = open(os.devnull, 'w')
print('Fubar')
with RedirectStdStreams(stdout=devnull, stderr=devnull):
print("You'll never see me")
print("I'm back!")
الاستنتاج يعمل الحل المقدم على تعزيز نمط مدير السياق لإعادة توجيه stdout وstderr مؤقتًا، والتحايل على قيود الأساليب السابقة . تثبت هذه التقنية أنها مفيدة بشكل خاص عند التعامل مع الوظائف التي تمتلك مراجع محلية لهذه التدفقات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3