استفاده از Icecream بجای Print برای Debug در پایتون

اگه شما هم عادت دارین از دستور Print برای لاگ کردن موقع دیباگ کد پایتون استفاده کنین، از امروز می خواهیم دستور print رو با Icecream جایگزین کنیم.

وقتی داریم از print برای دیباگ کردن کد استفاده می کنیم، همیشه گیج کننده است که بین چندین لاین کد برگردیم و تشخیص بدیم کدوم خروجی پرینت شده مال کد خط از کد هست.

برای مثال ، با اجرا اسکریپت زیر :

num1 = 30
num2 = 40  
print(num1)
print(num2)

این خروجی رو می بینیم :

30
40

کدوم یک از این عددا مربوط به num1 هست و کدوم num2 ؟ خب چون دوتا خروجی داریم تشخیصش سخت نیست اما اگه تعداد زیادی بود چی ؟ گیج کننده و زمانبر بود تا بفهمیم خروجی برای کدوم پرینت هست.

خب میشه پیشنهاد بدیم که اسم متغیر رو هم کنار مقدارش چاپ کنیم :

num1 = 30
num2 = 40 
print('num1', num1)
print('num2', num2)

و خروجی زیر رو بدست بیاریم:

num1 30
num2 40

این خروجی مفهوم تر شد، اما همچنان نوشتن کد اضافی زمانبره، آیا راهی وجود داره که چنین خروجی رو با کد ساده تری تولید کنیم ؟

num1 = 30
num2 = 40 
ic(num1)
ic(num2)

و نتیجه :

ic| num1: 30
ic| num2: 40

اینجاست که دستور Icecream به دردمون میخوره.

کتابخانه icecream چیست ؟

همونطور که از عنوان مشخصه، icecream یه کتابخانه پایتون هست که کمک میکنه تا دیباگ کردن با دستور پرینت راحتر و کاربردی تر بشه.

برای نصب Icecream :

pip install icecream

و برای استفاده از اون در کد :

from icecream import ic 

حالا با یه function امتحانش می کنیم:

from icecream import ic  
def plus_five(num): 
        return num + 5 
ic(plus_five(4))
ic(plus_five(5))

و نتیجه :

ic| plus_five(4): 9
ic| plus_five(5): 10

با استفاده از ic ، ما نه تنها خروجی رو می بینیم بلکه تابع و پارامتر ورودی اون رو هم خواهیم داشت!

گاهی لازم داریم تا بدونیم کدوم بخش از کد اجرا میشه، مثلا برای چک کردن وضعیت شرط هایی که توی کد استفاده کردیم، برای مثال :

def hello(user:bool):
     if user:
           print(&quotI'm user&quot)
      else:
           print(&quotI'm not user&quot)
hello(user=True)

نتیجه اجرا کد :

I'm user

با استفاده از icecream اینکار ساده تر خواهد شد و بدون هیچ کد اضافه ای تنها با دستور ic همین نتیجه رو میشه بدست آورد.

from icecream import ic 
def hello(user:bool):
      if user:
             ic()
       else:
             ic()
hello(user=True)

نتیجه اجرا کد :

ic| icecream_example.py:4 in hello() at 01:05:20.315

نتیجه بدست اومده بما میگه که خط 4 کد اجرا شده که در تابع hello هست و خط 6 اجرا نشده.

آیا امکان بدست آوردن اطلاعات بیشتری وجود دارد ؟

برای جزئیات بیشتر در

ic.configureOutput()

مقدار includeContext=True رو ست کنین، در اینصورت علاوه بر اطلاعات قبلی، اطلاعات زیر رو هم خواهیم داشت:

ic| icecream_example.py:7 in <module>- plus_five(4):9

پس مشخص میشه که توی تابع plus_five در کد icecream_example.py لاین 7 اجرا شده و نتیجه 9 بوده .

همه icecream ها رو بعد از تموم شدن debugging حذف کنید

ممکنه توی کد دستور Print رو برای هدف دیگه ای جز debug کردن استفاده کرده باشین و تشخیص اینها بعد از نهایی شدن کد سخت خواهد بود. اما با ic براحتی میتونیم بعد از اتمام کار اونها رو سرچ کنین و پاک کنین.

حالا کد شما تمیز شده.

نتیجه گیری

یادگرفتیم چطور از icecream برای دیباگ کردن کد پایتون استفاده کنیم، شما میتونین منو در لینکدین دنبال کنین تا در آینده مطالب مفیدتری در مورد data science در کنارهم بخونیم.


منبع :

https://towardsdatascience.com/