تقنية

KW_ONLY في dataclass: هل يظهر اسم الفاصل ضمن fields؟

field names: number, label.
الحقول الفعلية.

KW_ONLY علامة نوعية لفاصل؛ اسمه مهمل، والحقول اللاحقة له تمرر بالكلمات المفتاحية في التهيئة. [1]

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

لا؛ اسم الفاصل ليس حقلًا فعليًا. [1]

  • KW_ONLY علامة نوعية لفاصل؛ اسمه مهمل، والحقول اللاحقة له تمرر بالكلمات المفتاحية في التهيئة. [1]
  • على CPython 3.12.14، Packet تعرف number:int ثم _:KW_ONLY ثم label:str؛ own=Packet(4,label="bud"). [1]
  • أسماء حقول fields(Packet) هي number ثم label فقط؛ اسم الفاصل مستبعد، وlabel باقية ضمن الحقول. [1]
  • hasattr(own,"_") تعطي False؛ لا نضع قيمة لاسم الفاصل في تعريفنا. [1]
  • Packet(4,"bud") ترفع TypeError؛ الوسيط الثاني يحتاج اسمًا. تحكم بتمرير label باسمها: إنشاء own نجح، وown.number هي 4 وown.label هي bud. نستخدم تهيئة مولدة وفاصلًا واحدًا دون وراثة. [1]

العلامة والاسم

KW_ONLY علامة نوعية لفاصل؛ اسمه مهمل، والحقول اللاحقة له تمرر بالكلمات المفتاحية في التهيئة. [1]

موضع الفاصل

على CPython 3.12.14، Packet تعرف number:int ثم _:KW_ONLY ثم label:str؛ own=Packet(4,label="bud"). [1]

أسماء الحقول

أسماء حقول fields(Packet) هي number ثم label فقط؛ اسم الفاصل مستبعد، وlabel باقية ضمن الحقول. [1]

from dataclasses import dataclass,fields,KW_ONLY @dataclass class Packet: number:int _:KW_ONLY label:str own=Packet(4,label="bud") print([entry.name for entry in fields(Packet)]) print(hasattr(own,"_")) [1]

Packet(4,"bud"): TypeError.
الوسيط الثاني يحتاج اسمًا.

غياب السمة والتحكم

hasattr(own,"_") تعطي False؛ لا نضع قيمة لاسم الفاصل في تعريفنا. [1]

try:Packet(4,"bud") except TypeError:print("TypeError") print(own.number,own.label) [1]

Packet(4,"bud") ترفع TypeError؛ الوسيط الثاني يحتاج اسمًا. تحكم بتمرير label باسمها: إنشاء own نجح، وown.number هي 4 وown.label هي bud. نستخدم تهيئة مولدة وفاصلًا واحدًا دون وراثة. [1]

المراجع

  1. Python KW_ONLY

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

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