تعمل على محتوى الملف على الرغم من الفشل في كتلة "مع"

StackOverflow https://stackoverflow.com/questions/3723212

  •  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)

نظرًا لأن تكلفة إعادة التثبيت والتحقق من المباريات ستكون إهمالًا لسلسلة فارغة.

ومع ذلك ، فإن إغلاق الملف على الفور ليس مهمًا طالما أنه مغلق في النهاية ، على افتراض أنك لا تعيد استخدامه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top