تقنية

hash في بايثون: هل يبقى المرجع الضعيف قابلًا للتجزئة بعد اختفاء الكائن؟

weakref r; Node hash=17; r() is None; no earlier hash(r); hash(r): TypeError
تجزئة متأخرة.

في CPython 3.12.14، نداء hash الأول للمرجع بعد اختفاء كائننا يفشل؛ النداء السابق يغير نتيجة التحكم. [1] [2]

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

نعم بعد تجزئة سابقة هنا. [1] [2]

  • في CPython 3.12.14، نداء hash الأول للمرجع بعد اختفاء كائننا يفشل؛ النداء السابق يغير نتيجة التحكم. [1] [2]
  • صنفنا Node يعيد 17 من __hash__، بلا دورة أو مرجع قوي إضافي؛ ref تنشئ مرجعًا ضعيفًا. [1] [2]
  • بعد حذف own، تعيد own_ref القيمة None. أول نداء hash(own_ref) يرفع TypeError. [1] [2]
  • تحكم مستقل: hash(control_ref) تعطي 17 قبل الحذف، وتبقى 17 بعد أن يعيد المرجع None. [1] [2]
  • التنفيذ يعيد قيمة التجزئة المحفوظة قبل فحص غياب الكائن. نجاح hash لا يثبت بقاء الكائن؛ لا نعمم توقيت اختفائه. [1] [2]

النداء السابق

في CPython 3.12.14، نداء hash الأول للمرجع بعد اختفاء كائننا يفشل؛ النداء السابق يغير نتيجة التحكم. [1] [2]

صنفنا

صنفنا Node يعيد 17 من __hash__، بلا دورة أو مرجع قوي إضافي؛ ref تنشئ مرجعًا ضعيفًا. [1] [2]

النداء الأول

بعد حذف own، تعيد own_ref القيمة None. أول نداء hash(own_ref) يرفع TypeError. [1] [2]

from weakref import ref class Node: def __hash__(self):return 17 own=Node();own_ref=ref(own) del own print(own_ref() is None) try:hash(own_ref) except TypeError:print("TypeError") [1] [2]

weakref r; Node hash=17; prior hash(r)=17; r() is None; hash(r): 17
تجزئة محفوظة.

التحكم

تحكم مستقل: hash(control_ref) تعطي 17 قبل الحذف، وتبقى 17 بعد أن يعيد المرجع None. [1] [2]

control=Node();control_ref=ref(control) print(hash(control_ref)) del control print(control_ref() is None,hash(control_ref)) [1] [2]

التنفيذ يعيد قيمة التجزئة المحفوظة قبل فحص غياب الكائن. نجاح hash لا يثبت بقاء الكائن؛ لا نعمم توقيت اختفائه. [1] [2]

المراجع

  1. Python weakref
  2. CPython weakref

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

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