سؤال

هل هذه هي الطريقة الصحيحة لاستخدام بيان بيثون "مع" مع كتلة المحاولة؟:

try:
    with open("file", "r") as f:
        line = f.readline()
except IOError:
    <whatever>

إذا كان الأمر كذلك ، فعندئذٍ بالنظر إلى الطريقة القديمة لفعل الأشياء:

try:
    f = open("file", "r")
    line = f.readline()
except IOError:
    <whatever>
finally:
    f.close()

هل الفائدة الأساسية لبيان "مع" هنا يمكننا التخلص من ثلاثة أسطر من التعليمات البرمجية؟ لا يبدو ذلك مقنعًا بالنسبة لي لحالة الاستخدام هذه (على الرغم من أنني أفهم أن بيان "مع" له استخدامات أخرى).

تحرير: هل وظيفة كتلتين أعلاه من الكود متطابقة؟

EDIT2: تتحدث الإجابات القليلة الأولى عمومًا عن فوائد استخدام "مع" ، لكن تلك التي تبدو ذات فائدة هامشية هنا. لقد كنا جميعًا (أو كان ينبغي أن نكون) ندعو بشكل صريح f.close () لسنوات. أفترض أن إحدى الفوائد هي أن المبرمجين القذرين سوف يستفيدون من استخدام "مع".

هل كانت مفيدة؟

المحلول

  1. كتل الرمزتين اللتين قدمتهماليس ما يعادل
  2. الرمز الذي وصفته على أنه الطريقة القديمة لفعل الأشياء لديه خطأ خطير: في حالة فشل الملف ، ستحصل على استثناء آخر فيfinally بند بسبب f غير ملزم.

سيكون رمز النمط القديم المكافئ:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

كما ترون ، with يمكن أن يجعل العبارة الأمور أقل عرضة للخطأ. في الإصدارات الأحدث من Python (2.7 ، 3.1) ، يمكنك أيضًا الجمع بين تعبيرات متعددة في واحدة with بيان. فمثلا:

with open("input", "r") as inp, open("output", "w") as out:
    out.write(inp.read())

إلى جانب ذلك ، أنا شخصياً أعتبرها عادة سيئة لالتقاط أي استثناء في أقرب وقت ممكن. هذا ليس الغرض من الاستثناءات. إذا كانت وظيفة IO التي يمكن أن تفشل جزءًا من عملية أكثر تعقيدًا ، فيجب في معظم الحالات أن تعمل IOERROR على إحباط العملية بأكملها وبالتالي يتم التعامل معها في المستوى الخارجي. استخدام with عبارات ، يمكنك التخلص من كل هذه try...finally البيانات في المستويات الداخلية.

نصائح أخرى

إذا كانت محتويات finally يتم تحديد الكتلة من خلال خصائص كائن الملف الذي يتم فتحه ، لماذا لا ينبغي أن يكون تطبيق كائن الملف هو واحد لكتابة finally الكتلة؟ هذا فائدة with بيان ، أكثر بكثير من حفظ ثلاثة أسطر من التعليمات البرمجية في هذه الحالة بالذات.

ونعم ، الطريقة التي قمت بدمجها with و try-except هي الطريقة الوحيدة للقيام بذلك ، حيث أن الأخطاء الاستثنائية تسببت في open لا يمكن القبض على البيان نفسه داخل with الكتلة.

أعتقد أنك أخطأت في بيان "مع" أنه يقلل من الخطوط فقط. انها في الواقع لا تهيئة والتعامل مع teardown.

في حالتك "مع" لا

  • فتح ملف،
  • معالجة محتوياتها ، و
  • تأكد من إغلاقه.

هنا رابط لفهم "مع" بيان ": http://effbot.org/zone/python-with-statement.htm

تحرير: نعم استخدامك لـ "with" صحيح ووظائف كلا كتلتين الكود متطابقة. سؤال حول سبب استخدام "مع"؟ إنه بسبب الفوائد التي تحصل عليها. كما ذكرت عن مفقود عن طريق الخطأ f.close ().

الطريقة الأكثر إثارة للرموز التالية هي:

try:
    f = open("file", "r")
    try:
        line = f.readline()
    finally:
        f.close()
except IOError:
    <whatever>

try:
    f = open("file", "r")
except IOError:
    <whatever>
else:
    f.close()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top