کمی دیوانه‌بازی با f-string های python

سلام دوستان، امیدوارم حالتون خوب باشه. خیلی هاتون با f-string ها آشنایی دارید و هر روز از اونها استفاده می کنید. شاید فکر کنید که f-string ها فقط قادرند مقادیر رو در اواسط string ها جایگذاری کنند ولی در واقع ویژگی های زیادی دارند که شاید از اونها بی خبر باشید.

یکی از اون ویژگی ها اینه که شما می تونید با استفاده از format string ها در عملکرد و نتیجه تغییراتی ایجاد کنید. هر تغییر دیوانه‌واری که بخواهید!

به طور کلی format string ها رو اینطوری می تونیم به formatter پایتون بدیم:

f&quot {some_value:this is format string} &quot

چند مثال

می تونید با روش زیر اعداد اعشاری رو تا دو رقم اعشار رُند کنید:

some_float_number = 45.214564625
f&quot {some_float_number:.2f} &quot # 45.21

یا با روش زیر می تونید فرمت برای چاپ زمان به صورت String رو مشخص کنید:

from datetime import datetime
f&quot{datetime.now():%y %m %d, %H:%M:%S}&quot # format = year month day, hour:minute:second

اما یک سوال. همه اینها چطور انجام میشه؟ پایتون داره در پشت صحنه با این format string ها چیکار می کنه؟ بهترین راه برای فهمیدن این مسئله اینه که خودمون یک کلاس بسازیم که قابل format باشه

شروع کار

اگر کد بالا رو اجرا کنید نتیجه به صورت زیر خواهد بود:

format_spec = 'Ashkan'
Ashkan is happy

همونطور که می بینید هرچیزی که به formatter بدیم رو می تونیم از طریق آرگومان format_spec در متد __format__ دریافت کنیم.

معرفی به متد __format__

در پایتون برخی متد ها هستند که قبل و بعد از اسمشون دو تا underscore (_) دارند. معمولا این نوع متد ها، متد های معمولی نیستند و کار های عجیب غریب می کنند به خاطر همین بهشون magic method هم گفته میشه. یکی از این متد ها __format__ هستش که برای تغییر format نمایش string یک نوع داده استفاده میشه. این متد به این صورت تعریف میشه:

class SomeClass:
    ...
    def __format__(self, format_spec: str) -> str: 
        ... # implementation goes here

طبق تعریف بالا، این تابع آرگومانی از نوع string به نام format_spec داره که از طریق اون می تونیم format stringـی که به formatter داده شده رو دریافت کنیم و همچنین پایتون از این تابع انتظار داره که یک string رو به عنوان خروجی برگردونه. string حاصل از اجرای متد __format__ دقیقا همون چیزی هست که بعدا برای جایگذاری وسط یک string دیگه ازش استفاده میشه.

درصورتی که حاصل متد یک string نباشه پایتون به شما خطای TypeError خواهد داد.

توجه کنید که این تابع فقط یک interface بین شما و formatter پایتون ایجاد می کنه تا بتونید format string ها رو دریافت کنید ولی هیچ پردازشی به خودی خود انجام نمیده و این کاملا به شما بستگی داره که با اون format string چیکار می کنید و در نهایت چه چیزی رو به عنوان نتیجه به پایتون تحویل میدید. درسته که سخته ولی حداقل می دونید که دقیقا دارید چیکار می کنید.

این مدل خیلی به برنامه نویس ها آزادی عمل میده و به همین خاطر می تونید خیلی کار ها باهاش انجام بدید. حتی کار هایی که هیچ ربطی به عملکرد اصلی اون نداره.

کمی کار های دیوانه‌وار با format string ها

خوب، حالا که این همه آزادی عمل داریم، بیاید یه کار هایی انجام بدیم.

نوشتن در فایل log بعد از print

فرض کنید که شما در جایی از برنامه می خواهید که یک پیام رو هم چاپ کنید و هم در یک فایل log سیو کنید. در اون صورت با format string ها می تونید همچین کاری کنید:

البته در عکس میبینید که کلمه های print و and رنگی شده اند. این به خاطر این هست که editor ما اصلا در خواب هم نمی دید همچین کاری بخواهیم انجام بدیم! فکر کنم اگه خیدوفان رسوم (سازنده پایتون) این رو ببینه درجا سکته کنه خخخخ.

البته می تونید از این بدترش کنید. مثلا می تونید message رو روی یک سرور دیگه ذخیره کنید و ... کار هایی از این قبیل

مشخص کردن عملیات ریاضی بین دو عدد با format string

این هم یک دیوانه بازی دیگه! البته مطمئنا هیچ کس همچین کاری با format string ها نمی کنه. اما من دارم بهتون پتانسیل format string ها و آزادی عملی که در اختیارتون میزارند رو نشون میدم تا ببینید چه کار هایی میشه با اینها انجام داد.



خیلی خوب، به انتهای این پست رسیدیم. امیدوارم لذت برده باشید. اگر خوشتون اومد لایک کنید اگر سوال، پیشنهاد یا انتقادی داشتید کامنت بزارید. ممنون که وقت تون رو به پست من دادید. تا پست بعد خدانگهدار.