تقنية

frozen في dataclass: هل يضمن نجاح hash مع حقل قائمة؟

hash(own): TypeError.
نداء الهاش يفشل.

frozen=True مع eq الافتراضي تولد __hash__؛ توليدها لا يضمن نجاح hash في مثالنا. [1] [2]

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

لا؛ حقل القائمة يمنع نجاح النداء هنا. [1] [2]

  • frozen=True مع eq الافتراضي تولد __hash__؛ توليدها لا يضمن نجاح hash في مثالنا. [1] [2]
  • على CPython 3.12.14، Box تستخدم frozen=True وحقل items بقائمة؛ own=Box([2]). [1] [2]
  • Box.__hash__ ليست None؛ لكن hash(own) ترفع TypeError. وجود الطريقة يختلف عن نجاح تنفيذها. [1] [2]
  • own.items تبقى بقائمة تضم 2 بعد محاولة الهاش. [1] [2]
  • تحكم مستقل: Fixed مجمدة بحقل items من tuple؛ control=Fixed((2,)). hash(control) تنجح وتعيد int. نترك eq وإدراج الحقل في الهاش افتراضيين، بلا طريقة هاش مخصصة. [1] [2]

توليد الطريقة

frozen=True مع eq الافتراضي تولد __hash__؛ توليدها لا يضمن نجاح hash في مثالنا. [1] [2]

كائن بقائمة

على CPython 3.12.14، Box تستخدم frozen=True وحقل items بقائمة؛ own=Box([2]). [1] [2]

طريقة موجودة ونداء فاشل

Box.__hash__ ليست None؛ لكن hash(own) ترفع TypeError. وجود الطريقة يختلف عن نجاح تنفيذها. [1] [2]

from dataclasses import dataclass @dataclass(frozen=True) class Box:items:list own=Box([2]) print(Box.__hash__ is not None) try:hash(own) except TypeError:print("TypeError") print(own.items) [1] [2]

hash(control) type: int.
تحكم الهاش ينجح.

القائمة والتحكم

own.items تبقى بقائمة تضم 2 بعد محاولة الهاش. [1] [2]

@dataclass(frozen=True) class Fixed:items:tuple control=Fixed((2,)) print(type(hash(control)).__name__) [1] [2]

تحكم مستقل: Fixed مجمدة بحقل items من tuple؛ control=Fixed((2,)). hash(control) تنجح وتعيد int. نترك eq وإدراج الحقل في الهاش افتراضيين، بلا طريقة هاش مخصصة. [1] [2]

المراجع

  1. Python dataclass hash
  2. CPython 3.12.14 hash

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

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