حل بديل عن عائد Python 2.4 غير مسموح به في مجموعة Try مع شرط أخيرًا

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

سؤال

أنا عالق على Python2.4 ، لذلك لا يمكنني استخدام بند أخيرًا مع المولدات أو yield. هل هناك أي طريقة للتغلب على ذلك؟

لا يمكنني العثور على أي إشارات حول كيفية العمل حول هذا القيد في بيثون 2.4 ، وأنا لست معجبًا كبيرًا بالحلول التي فكرت بها (تتضمن بشكل رئيسي __del__ ومحاولة التأكد من أنها تعمل في غضون وقت معقول) ليست جذابة للغاية.

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

المحلول

يمكنك تكرار الكود لتجنب الكتلة أخيرًا:

try:
  yield 42
finally:
  do_something()

يصبح:

try:
  yield 42
except:  # bare except, catches *anything*
  do_something()
  raise  # re-raise same exception
do_something()

(لم أجرب هذا على Python 2.4 ، قد تضطر إلى إلقاء نظرة على sys.exc_info بدلاً من إعادة بيان أعلاه ، كما في raise sys.exc_info[0], sys.exc_info[1], sys.exc_info[2].)

نصائح أخرى

الكود الوحيد المضمون ليتم استدعاؤه عندما يتم التخلي عن مثيل المولد ببساطة (جمع القمامة) هو __del__ طرق لمتغيراتها المحلية (إذا لم تكن هناك إشارات إلى تلك الكائنات في الخارج) وعمليات الاسترجاعات للمراجع الضعيفة إلى متغيراتها المحلية (DITTO). أوصي بالمسار المرجعي الضعيف لأنه غير جراحي (لا تحتاج إلى فصل خاص مع أ __del__ - مجرد أي شيء يمكن الإشارة إليه بشكل ضعيف). على سبيل المثال:

import weakref

def gen():
  x = set()
  def finis(*_):
    print 'finis!'
  y = weakref.ref(x, finis)
  for i in range(99):
    yield i

for i in gen():
  if i>5: break

هذا يطبع finis!, ، حسب الرغبة.

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