علوم وفضاء

format: هل يكفي __str__ لقبول صيغة غير فارغة؟

سجل فارغ عند خطأ الصيغة، واستدعاء واحد عند الصيغة الفارغة.
صنفنا يرث __format__ الافتراضية.

وجود __str__ لا يمنح التنسيق الافتراضي خيارات النص؛ الصيغة الفارغة مقبولة، وغير الفارغة ترفع TypeError. [1] [2]

حدود التنفيذ الموروث

التنفيذ الافتراضي يمرر الصيغة الفارغة إلى __str__؛ ويرفض أي صيغة غير فارغة. [1] [2]

السؤال يهم من يضيف طريقة عرض نصي إلى صنف، ثم يتوقع قبول محاذاة السلاسل تلقائيًا. نختبر ذلك بصنفنا، دون تخصيص __format__.

صنف يعرض كلمة

class Printable: def __init__(self): self.calls=[] def __str__(self): self.calls.append("str") return "sprout"

x=Printable() try: format(x,">9") except TypeError: print("TypeError",x.calls) # TypeError []

لا توجد نتيجة نصية لهذا الطلب. السجل الفارغ يبين أن طريقة العرض لم تُستدعَ أثناء هذا الخطأ في مثالنا.

الصيغة الفارغة

y=Printable() print(format(y,""),y.calls) # sprout ["str"]

أبقينا الصنف نفسه وغيرنا الصيغة فقط. هنا أعاد الطلب الكلمة وسجل استدعاءً واحدًا؛ فالمشكلة السابقة ليست عجز __str__ عن إنتاج نص.

نص مستقل ومحاذاة بثلاث مسافات.
تحويل صريح إلى نص قبل التنسيق.

نص صريح ونطاق الاختبار

z=Printable() print(repr(format(str(z),">9")),z.calls) # ' sprout' ["str"]

التحكم يحول الكائن إلى نص أولًا؛ الناتج ثلاث مسافات ثم الكلمة، أي تسعة محارف. المرجع اليدوي يبني المسافات بالتكرار قبل الكلمة.

نجحت 168 مجموعة تحقق في 28 حالة: 27 حالة للكلمات bud وleaf وsea مع العروض من 0 إلى 8، ومثال sprout بعرض 9. تحققت كل حالة من الخطأ وسجل الاستدعاءات، والنص الفارغ الصيغة وسجله، والمحاذاة بعد التحويل وسجلها.

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

الطلبالنتيجةسجل الاستدعاءات
format(x,">9")TypeError[]
format(y,"")sprout["str"]
format(str(z),">9")ثلاث مسافات ثم sprout["str"]

للتوسع: صيغة الطابع الزمني ومعناه.

المراجع

  1. Python object.__format__
  2. CPython default formatter

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