تقنية

weakref.proxy في بايثون: هل تقبل hash تجزئة الوكيل؟

Node; __hash__ returns 17; own alive; p=proxy(own); hash(own):17; hash(p):TypeError
رفض الوكيل.

لا؛ الوكيل غير قابل للتجزئة رغم أن كائننا حي ويقبل hash. [1] [2]

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

لا في هذا المثال. [1] [2]

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

قبول التجزئة

لا؛ الوكيل غير قابل للتجزئة رغم أن كائننا حي ويقبل hash. [1] [2]

كائن حي

في CPython 3.12.14، Node تعيد 17 من __hash__؛ own تبقى مرجعًا قويًا، وننشئ p=proxy(own). [1] [2]

كائن ووكيل

hash(own) تعطي 17، لكن hash(p) ترفع TypeError؛ لا ينتظر الرفض اختفاء الكائن. [1] [2]

from weakref import proxy,ref class Node: def __hash__(self):return 17 own=Node();p=proxy(own) print(hash(own)) try:hash(p) except TypeError:print("TypeError") [1] [2]

Node; __hash__ returns 17; control alive; r=ref(control); hash(r):17; r() is control:True
نجاح المرجع.

القاعدة والتحكم

الوثائق تستثني الوكلاء من التجزئة بصرف النظر عن الكائن؛ تعريف نوع الوكيل يتعمد إغفال tp_hash. [1] [2]

control=Node();r=ref(control) print(hash(r),r() is control) [1] [2]

تحكم مستقل: r=ref(control)؛ hash(r) تعطي 17 وr() is control تعطي True. التحكم مرجع ضعيف، لا وكيل؛ لا نحذف الكائنات أو نختبر مفاتيح القواميس. [1] [2]

المراجع

  1. Python weakref
  2. CPython weakref

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

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