تقنية

dataclass في بايثون: هل تقبل قائمة كقيمة افتراضية للحقل؟

Box list default: ValueError.
الافتراضي مرفوض.

قائمة افتراضية مباشرة للحقل ترفضها dataclass؛ استخدم field(default_factory=list) لقائمة جديدة عند الحاجة إلى الافتراضي. [1]

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

لا؛ تعريف مثالنا يرفع ValueError. [1]

  • قائمة افتراضية مباشرة للحقل ترفضها dataclass؛ استخدم field(default_factory=list) لقائمة جديدة عند الحاجة إلى الافتراضي. [1]
  • على CPython 3.12.14، نحاول تعريف Box بحقل items:list=[]؛ القائمة الافتراضية فارغة. [1]
  • تطبيق المزخرف يرفع ValueError أثناء التعريف؛ لا ننشئ مثيلًا من Box. [1]
  • تحكم Plain تستخدم field(default_factory=list)؛ control وother مثيلان أنشأناهما دون تمرير items، ولكل منهما قائمة فارغة مختلفة. [1]
  • بعد control.items.append(2)، control.items تضم 2 وother.items تبقى فارغة. نختبر قائمة عادية ومصنع list وتهيئة مولدة؛ المصنع المخصص الذي يعيد قائمة مشتركة خارج المثال. [1]

قيمة أم مصنع؟

قائمة افتراضية مباشرة للحقل ترفضها dataclass؛ استخدم field(default_factory=list) لقائمة جديدة عند الحاجة إلى الافتراضي. [1]

القائمة المباشرة

على CPython 3.12.14، نحاول تعريف Box بحقل items:list=[]؛ القائمة الافتراضية فارغة. [1]

رفض التعريف

تطبيق المزخرف يرفع ValueError أثناء التعريف؛ لا ننشئ مثيلًا من Box. [1]

from dataclasses import dataclass,field try: @dataclass class Box:items:list=[] except ValueError:print("ValueError") [1]

other.items after control append: [].
قائمة الثاني فارغة.

المصنع والمثيلان

تحكم Plain تستخدم field(default_factory=list)؛ control وother مثيلان أنشأناهما دون تمرير items، ولكل منهما قائمة فارغة مختلفة. [1]

@dataclass class Plain:items:list=field(default_factory=list) control=Plain();other=Plain() print(control.items is other.items,control.items,other.items) control.items.append(2) print(control.items,other.items) [1]

بعد control.items.append(2)، control.items تضم 2 وother.items تبقى فارغة. نختبر قائمة عادية ومصنع list وتهيئة مولدة؛ المصنع المخصص الذي يعيد قائمة مشتركة خارج المثال. [1]

المراجع

  1. Python mutable defaults

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

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