تقنية

weakref_slot في dataclass: هل يعمل دون slots=True؟

weakref_slot=True وحدها: TypeError عند التزيين.
الخيار وحده مرفوض.

weakref_slot=True تتطلب slots=True؛ افتراضي slots هو False. [1]

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

لا؛ الجمع بينهما مطلوب. [1]

  • weakref_slot=True تتطلب slots=True؛ افتراضي slots هو False. [1]
  • على CPython 3.12.14، Bad تعرف number مع weakref_slot=True وحدها؛ لا نحدد slots. [1]
  • تطبيق المزخرف يرفع TypeError؛ الخطأ يقع أثناء تعريف الفئة، قبل استدعائها لإنشاء مثيل. [1]
  • بعد التقاط الخطأ، الاسم Bad غير مربوط في نطاق اختبارنا الجديد. [1]
  • تحكم Fixed تستخدم slots=True وweakref_slot=True: تعريفها ينجح، وFixed(7) تحمل number=7. فتحاتها number و__weakref__. نختبر فئة بلا وراثة أو فتحات مكتوبة يدويًا. [1]

شرط الخيار

weakref_slot=True تتطلب slots=True؛ افتراضي slots هو False. [1]

الخيار المنفرد

على CPython 3.12.14، Bad تعرف number مع weakref_slot=True وحدها؛ لا نحدد slots. [1]

موضع الخطأ

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

from dataclasses import dataclass try: @dataclass(weakref_slot=True) class Bad:number:int except TypeError:print("TypeError") print("Bad" in globals()) [1]

Fixed بالخيارين تنجح.
الخياران مقبولان.

الاسم والتحكم

بعد التقاط الخطأ، الاسم Bad غير مربوط في نطاق اختبارنا الجديد. [1]

@dataclass(slots=True,weakref_slot=True) class Fixed:number:int control=Fixed(7) print(control.number,Fixed.__slots__) [1]

تحكم Fixed تستخدم slots=True وweakref_slot=True: تعريفها ينجح، وFixed(7) تحمل number=7. فتحاتها number و__weakref__. نختبر فئة بلا وراثة أو فتحات مكتوبة يدويًا. [1]

المراجع

  1. Python weakref_slot

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

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