تقنية

frozen في dataclass: هل تمنع إضافة عنصر إلى قائمة الحقل؟

إسناد items يرفع FrozenInstanceError.
الإسناد يرفض.

frozen=True تمنع إسناد الحقل بالطريقة المعتادة؛ قائمة items نفسها تبقى قابلة للإضافة في مثالنا. [1]

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

لا؛ append تنجح هنا. [1]

  • frozen=True تمنع إسناد الحقل بالطريقة المعتادة؛ قائمة items نفسها تبقى قابلة للإضافة في مثالنا. [1]
  • على CPython 3.12.14، Box فئة dataclass مجمدة؛ نبني own بقائمة items فيها العنصر 2. [1]
  • own.items=[9] ترفع FrozenInstanceError؛ تبقى القائمة بالعنصر 2 بعد محاولة استبدال الحقل. [1]
  • own.items.append(5) تنجح؛ تصبح القائمة [2,5]. تعديل محتواها يختلف عن إسناد قائمة جديدة إلى الحقل. [1]
  • تحكم بفئة Plain دون frozen=True: إسناد items=[9] ينجح. نمرر قوائم عادية صراحة؛ لا نختبر قيمًا افتراضية مشتركة أو هاشًا أو تجاوز الحماية. [1]

الحقل ومحتواه

frozen=True تمنع إسناد الحقل بالطريقة المعتادة؛ قائمة items نفسها تبقى قابلة للإضافة في مثالنا. [1]

الكائن المجمد

على CPython 3.12.14، Box فئة dataclass مجمدة؛ نبني own بقائمة items فيها العنصر 2. [1]

إسناد الحقل

own.items=[9] ترفع FrozenInstanceError؛ تبقى القائمة بالعنصر 2 بعد محاولة استبدال الحقل. [1]

from dataclasses import dataclass,FrozenInstanceError @dataclass(frozen=True) class Box:items:list own=Box([2]) try:own.items=[9] except FrozenInstanceError:print("FrozenInstanceError") print(own.items) [1]

بعد append تصبح items بالقيمتين 2 و5.
المحتوى يتغير.

الإضافة والتحكم

own.items.append(5) تنجح؛ تصبح القائمة [2,5]. تعديل محتواها يختلف عن إسناد قائمة جديدة إلى الحقل. [1]

own.items.append(5) print(own.items) @dataclass class Plain:items:list control=Plain([2]);control.items=[9] print(control.items) [1]

تحكم بفئة Plain دون frozen=True: إسناد items=[9] ينجح. نمرر قوائم عادية صراحة؛ لا نختبر قيمًا افتراضية مشتركة أو هاشًا أو تجاوز الحماية. [1]

المراجع

  1. Python frozen instances

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

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