تقنية

lru_cache في بايثون: هل تحفظ الاستثناء للاستدعاء التالي؟

reject(2) مرتين: سجل [2,2] وحجم المخزن 0.
خطآن بلا نتيجة مخزنة.

في تجربتنا، lru_cache لا تحفظ ValueError الخارج من الدالة. [1] [2]

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

لا؛ الجسم يُستدعى مجددًا هنا. [1] [2]

  • في تجربتنا، lru_cache لا تحفظ ValueError الخارج من الدالة. [1] [2]
  • على CPython 3.12.14، maxsize=None؛ reject تسجل x ثم ترفع ValueError. [1] [2]
  • نداءان reject(2): خطآن وسجل [2,2]؛ الجسم عمل مرتين. [1] [2]
  • hits=0، misses=2، currsize=0؛ لم تُحفظ نتيجة. [1] [2]
  • تحكم accept(2) مرتين: [5,5]، استدعاء واحد، hits=1، misses=1، currsize=1؛ دالتنا تعيد x+3. [1] [2]

خطأ خارج الدالة

في تجربتنا، lru_cache لا تحفظ ValueError الخارج من الدالة. [1] [2]

إعداد التجربة

على CPython 3.12.14، maxsize=None؛ reject تسجل x ثم ترفع ValueError. [1] [2]

نداءان فاشلان

نداءان reject(2): خطآن وسجل [2,2]؛ الجسم عمل مرتين. [1] [2]

from functools import lru_cache calls=[] @lru_cache(maxsize=None) def reject(x): calls.append(x) raise ValueError("leaf") for _ in range(2): try:reject(2) except ValueError:print("error") print(calls,reject.cache_info()) [1] [2]

accept(2) مرتين: سجل [2] وحجم المخزن 1.
نتيجة محفوظة.

المخزن والتحكم

hits=0، misses=2، currsize=0؛ لم تُحفظ نتيجة. [1] [2]

ok_calls=[] @lru_cache(maxsize=None) def accept(x): ok_calls.append(x) return x+3 print(accept(2),accept(2)) print(ok_calls,accept.cache_info()) [1] [2]

تحكم accept(2) مرتين: [5,5]، استدعاء واحد، hits=1، misses=1، currsize=1؛ دالتنا تعيد x+3. [1] [2]

المراجع

  1. Python lru_cache
  2. CPython 3.12.14 native cache

للتوسع: لغات البرمجة.

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