تعمل على محتوى الملف على الرغم من الفشل في كتلة "مع"
-
03-10-2019 - |
سؤال
لقد كتبت للتو فائدة في بيثون للقيام بشيء أحتاجه (غير ذي صلة ، ولكنه لإنشاء ملف علامة متوافق مع CTAGS لـ DSL داخل المنزل).
على أي حال- أنا فتح وأقرأ الملف في سياق أ with
بيان ، وأنا فضولي ، كيف يميل الناس إلى التعامل مع الفشل في هذه العملية؟
الحل الخاص بي
with open(filename, 'rt') as f:
content = f.read()
matches = re.findall(REGEX, content)
if len(matches) > 0:
# do more stuff...
pass
وضعت فحص المباراة خارج البيان مع لأنني أحب إغلاق الملف وفعله. ومع ذلك، إذا content
لا يتم بناؤها أبدًا ، وسوف يفشل هذا.
كان حلي هو التهيئة content
إلى السلسلة الفارغة فوق هذا الجزء من الكود ، لكن الشعور الذي أشعر به هو أنني أود أن تنتهي الوظيفة فقط ؛ يتم طرد استثناء من الوظيفة أو شيء من هذا القبيل.
في هذه الحالة ، يمكنني وضع بقية الوظيفة في with
حظر ولكن هذا يوسع نطاق الملف المفتوح. يمكنني خلق content
قبل with
حظر بحيث يكون في ضوء الفشل. أنا فضولي ، ومع ذلك ، ما هي الحلول الأخرى التي يحب الناس رؤيتها (على افتراض أن السؤال منطقي في المقام الأول)؟
أفترض أنني سأشبه شيئًا كهذا:
with open(filename, 'rt') as f:
content = f.read()
else:
content = ''
matches = re.findall(REGEX, content)
سوف أقبل فكرة أنني فقط بحاجة إلى التعامل معها وترك الملف مفتوحًا لبقية الوظيفة إذا كان هذا هو الإجماع العام. قون
المحلول
ما سأفعله هو كما قلت:
content = ''
with open(filename, 'rt') as f:
content = f.read()
matches = re.findall(REGEX, content)
نظرًا لأن تكلفة إعادة التثبيت والتحقق من المباريات ستكون إهمالًا لسلسلة فارغة.
ومع ذلك ، فإن إغلاق الملف على الفور ليس مهمًا طالما أنه مغلق في النهاية ، على افتراض أنك لا تعيد استخدامه.