التنسيق الذي ستستخدمه فعليًا
تُعدّ f-string بايثون الطريقة الافتراضية في الكود الحديث لدمج القيم داخل النصوص. كل ما عليك فعله هو وضع حرف f قبل علامة الاقتباس الافتتاحية، وأي شيء تكتبه بين {...} يتحوّل إلى تعبير حيّ يُنفَّذ مباشرة:
هناك ثلاث نقاط تستحق الانتباه: البادئة f تحوّل النص بأكمله إلى قالب، والأقواس المعقوفة هي مواضع الاستبدال، والتعبير داخل الأقواس يُنفَّذ لحظة تشغيل print، لا لحظة كتابة النص.
ستستخدم f-string في بايثون أكثر بكثير من أي أسلوب تنسيق آخر، فهي أقصر من "Hello, " + name + "."، وأوضح من "Hello, %s." % name، وأكثر مرونة من .format().
أي تعبير قابل للتقييم يصلح داخل الأقواس
الأقواس المعقوفة لا تقتصر على أسماء المتغيرات فقط، بل يمكن وضع أي تعبير في لغة بايثون داخلها:
استدعاءات الدوال، الفهرسة، العمليات الحسابية، التعبيرات الشرطية — كلها مسموحة بلا مشاكل. القاعدة الوحيدة: خلّي ما بين الأقواس المعقوصة قصيرًا. لو كنت بتكتب عملية حسابية من ثلاثة أسطر داخل placeholder، احسبها أولًا في متغير بِاسم واضح واستخدم الاسم بدلًا منها.
تنسيق الأرقام في بايثون
وضع نقطتين : بعد التعبير يفتح لك ما يُسمى format spec — وهي لغة مصغّرة تتحكم بها في طريقة عرض القيمة:
دليل سريع يوضح وظيفة كل رمز:
.2f— عدد عشري بخانتين بعد الفاصلة. يُقرَّب الرقم عند العرض فقط.,— فاصلة لعزل الآلاف. تعمل معintوfloat..1%— يضرب القيمة في 100 ويضيف%في نهايتها. مثالية للنسب والمعدّلات..2e— الصيغة العلمية مع رقمين عشريين.
وطبعاً تقدر تدمج بينها. مثلاً f"{total:,.2f}" يُنتج "1,234.57".
الحشو والعرض والمحاذاة في f-string
لما تحتاج ترتّب مخرجاتك على شكل أعمدة متساوية:
<10 تعني "محاذاة لبداية السطر، مع حشو حتى 10 محارف على الأقل"، أما >5 فتعني "محاذاة لنهاية السطر، مع حشو حتى 5 محارف". ويمكنك أيضاً استخدام ^ للتوسيط.
ولو أردت الحشو بمحرف غير المسافة، ضع محرف الحشو قبل رمز المحاذاة:
تنسيق التواريخ
نفس الصيغة {value:spec} تعمل أيضًا مع كائنات datetime:
الصيغة التي تأتي بعد النقطتين هي ببساطة نفس صيغة strftime. كل رموز % التي تعمل مع strftime ستعمل هنا أيضًا — وسنتناولها بالتفصيل في صفحة datetime.
خدعة = للتصحيح (Debugging)
من أكثر المزايا فائدة رغم قلة شهرتها: ضع علامة = بعد التعبير، وستطبع بايثون نص التعبير مع قيمته في آن واحد:
تحصل على count=7 وprice=19.99 وcount * price=139.93. يعني اختصرت print("count =", count) كاملاً في ثلاث خانات فقط. احفظ هذه الحيلة جيداً، ستفيدك كثيراً عند تصحيح الأخطاء ورغبتك في طباعة قيم عدة متغيرات دفعة واحدة.
التعامل مع الأقواس المعقوفة داخل f-string
إذا أردت أن يظهر القوس { أو } كما هو في النص المطبوع، كرّره مرتين:
الأقواس المعقوفة المفردة تفتح تعبيرًا برمجيًا، أما {{ و }} فتُستخدم لطباعة { و } كما هي في النص الناتج.
f-string على عدة أسطر في بايثون
تعمل الـ f-string بشكل ممتاز مع علامات الاقتباس الثلاثية، وهذا مفيد جدًا لما تحتاج تكتب قالبًا نصيًا صغيرًا داخل الكود مباشرة:
وبما أن بايثون تقوم بربط السلاسل المتجاورة تلقائيًا، يمكنك تقسيم الـ f-string الطويل إلى عدة سلاسل متتالية:
متى سترى أساليب التنسيق القديمة؟
أثناء تصفحك للكود المكتوب مسبقًا، ستصادف أسلوبين قديمين لتنسيق النصوص في بايثون:
الثلاث طرق تعطي نفس النتيجة. لكن الـ f-string بايثون تتفوّق في سهولة القراءة في تسع حالات من عشر. استخدم .format() لمّا تحتاج تبني قالبًا مرة واحدة وتطبّقه على بيانات كثيرة، أمّا % فخلّيها محصورة في صيانة كود قديم يستخدمها أصلًا.
متى لا تستخدم الـ f-string؟
في حالتين يُفضّل اللجوء إلى أداة مختلفة.
بناء استعلامات SQL. إيّاك أن تُدخل مدخلات المستخدم داخل نص SQL عبر f-string. استعمل الاستعلامات ذات المعاملات (parameterized queries) التي توفّرها مكتبة قاعدة البيانات. استخدام f-string هنا هو الباب الذي تدخل منه ثغرات الـ SQL injection.
بناء نصوص واجهة متعدّدة اللغات. إذا كان تطبيقك يدعم أكثر من لغة، فأنت بحاجة إلى قوالب تستطيع أدوات الترجمة الخارجية التقاطها — عادةً دالة _(...) من gettext أو دالة مساعدة خاصة بإطار العمل الذي تستخدمه. الـ f-string تدمج البنية داخل الكود نفسه، وهذا يُصعّب عملية الترجمة كثيرًا.
فيما عدا ذلك — من سجلّات الـ logs، وطباعة الناتج في الطرفية، وتكوين الروابط، وبناء نصوص الإعدادات، وتنسيق الأرقام في بايثون للعرض — تبقى الـ f-string هي الخيار الأنسب.
التالي: الأرقام والقيم المنطقية
الـ f-string تُستخدم كثيرًا في تنسيق الأرقام، لذا يستحق الأمر أن نتعرّف على الأنواع الرقمية في لغة بايثون بشكل أعمق قليلًا. وهذا ما سنناقشه في الدرس القادم.
الأسئلة الشائعة
ما هي f-string في بايثون؟
هي سلسلة نصية تبدأ بالحرف f قبل علامات الاقتباس، وكل ما يوضع داخل {...} يُستبدل وقت التشغيل بقيمة التعبير المكتوب بداخله. مثلاً f"Hello, {name}" يُدرج القيمة الحالية للمتغير name داخل النص مباشرةً.
متى أُضيفت f-strings إلى بايثون؟
ظهرت مع الإصدار Python 3.6، وكل الإصدارات الحديثة تدعمها، فلا داعي للقلق بشأن التوافق ما دمت تكتب بـ Python 3. الأساليب القديمة مثل % و.format() لا تزال تعمل، لكنها أقل وضوحاً في معظم الحالات.
كيف أُنسّق رقماً إلى خانتين عشريتين في بايثون؟
ضع مواصفة التنسيق بعد النقطتين داخل الأقواس هكذا: f"{price:.2f}". الرمز .2f يعني «عدد عشري بخانتين بعد الفاصلة». العملية تقرّب القيمة المعروضة فقط، أما الرقم الأصلي المخزّن في المتغير فيبقى كما هو.
هل يمكنني وضع أي تعبير داخل f-string؟
نعم، تستطيع كتابة عمليات حسابية واستدعاء دوال وتوابع وحتى تعبيرات شرطية. مثلاً f"{name.upper()}" وf"{price * 1.2:.2f}" يعملان بلا مشاكل. لكن يُفضَّل إبقاء التعبيرات قصيرة؛ فإذا تعقّد الكود داخل الأقواس، احسب القيمة في متغير منفصل أولاً ثم ضعه.