تقنية

recursive_repr في بايثون: هل يبقى الحارس بعد فشل __repr__؟

فشل ثم إعادة
مثال توضيحي [1] [2]

نختبر إعادة المحاولة بعد فشل مؤلف. [1] [2]

الخلاصة السريعة

لا هنا؛ يمكن إعادة المحاولة بعد الفشل. [1] [2]

  • recursive_repr يحرس الاستدعاء المتكرر للكائن في الخيط نفسه. [1] [2]
  • في مثالنا، أول __repr__ تثير ValueError. [1] [2]
  • الاستدعاء التالي يعطي bud، وعدّاد التنفيذ 2. [1] [2]
  • المصدر يزيل علامة الحارس داخل finally، حتى بعد الاستثناء. [1] [2]
  • كائن مؤلف وخيط واحد؛ لم نغيّر حد العودية. [1] [2]

حارس الاستدعاء

recursive_repr يحرس الاستدعاء المتكرر للكائن في الخيط نفسه. [1] [2]

فشل ثم محاولة

from reprlib import recursive_repr
class Node:
 calls=0
 @recursive_repr("blocked")
 def __repr__(self):
  self.calls+=1
  if self.calls==1:raise ValueError
  return "bud"
n=Node()
try:repr(n)
except ValueError:print("ValueError")
print(repr(n),n.calls)

[1] [2]

في مثالنا، أول __repr__ تثير ValueError. [1] [2]

الاستدعاء التالي يعطي bud، وعدّاد التنفيذ 2. [1] [2]

التنظيف والنطاق

المصدر يزيل علامة الحارس داخل finally، حتى بعد الاستثناء. [1] [2]

كائن مؤلف وخيط واحد؛ لم نغيّر حد العودية. [1] [2]

تحكم بالاستدعاء المتكرر
تحكم توضيحي منفصل [1] [2]

المراجع

  1. Python 3.12: recursive_repr
  2. CPython 3.12.14: recursion marker cleanup
  3. موضوع تك: لغة بايثون — مفردات
  4. موضوع تك: تطبيقات بايثون — مفردات

للتوسع: بحث عن لغات البرمجة

أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.