تقنية

unsafe_hash في dataclass: هل يقبل __hash__ المكتوبة؟

Bad unsafe_hash=True + __hash__: TypeError.
رفض الجمع بين الطلبين.

unsafe_hash=True مع __hash__ مكتوبة في الفئة يرفع TypeError؛ المزخرف لا يجمع الطلبين. [1]

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

لا؛ تعريف Bad يرفض هنا. [1]

  • unsafe_hash=True مع __hash__ مكتوبة في الفئة يرفع TypeError؛ المزخرف لا يجمع الطلبين. [1]
  • على CPython 3.12.14، Bad تعرف number:int وطريقة __hash__ تعيد 17؛ نطبق @dataclass(unsafe_hash=True). [1]
  • تطبيق المزخرف يرفع TypeError أثناء التعريف، قبل إنشاء مثيل أو استدعاء hash عليه. [1]
  • تحكم مستقل: Fixed تعرف number:int وطريقة __hash__ تعيد 17؛ نستخدم @dataclass بالإعدادات الافتراضية، ومنها unsafe_hash=False. [1]
  • control=Fixed(4) تنجح: control.number هي 4، وhash(control) تعطي 17 من الطريقة المكتوبة. نختبر تعارض خيار التوليد مع طريقة مباشرة، دون وراثة أو تجميد؛ القيمة الثابتة تحكم للاختبار. [1]

تعارض الخيار والطريقة

unsafe_hash=True مع __hash__ مكتوبة في الفئة يرفع TypeError؛ المزخرف لا يجمع الطلبين. [1]

توليد مطلوب وطريقة موجودة

على CPython 3.12.14، Bad تعرف number:int وطريقة __hash__ تعيد 17؛ نطبق @dataclass(unsafe_hash=True). [1]

رفض التعريف

تطبيق المزخرف يرفع TypeError أثناء التعريف، قبل إنشاء مثيل أو استدعاء hash عليه. [1]

from dataclasses import dataclass try: @dataclass(unsafe_hash=True) class Bad: number:int def __hash__(self):return 17 except TypeError:print("TypeError") [1]

Fixed default; hash(control): 17.
الافتراضي يحفظ الطريقة.

الافتراضي والتحكم

تحكم مستقل: Fixed تعرف number:int وطريقة __hash__ تعيد 17؛ نستخدم @dataclass بالإعدادات الافتراضية، ومنها unsafe_hash=False. [1]

@dataclass class Fixed: number:int def __hash__(self):return 17 control=Fixed(4) print(control.number,hash(control)) [1]

control=Fixed(4) تنجح: control.number هي 4، وhash(control) تعطي 17 من الطريقة المكتوبة. نختبر تعارض خيار التوليد مع طريقة مباشرة، دون وراثة أو تجميد؛ القيمة الثابتة تحكم للاختبار. [1]

المراجع

  1. Python explicit hash

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

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